#include <bits/stdc++.h>
using namespace std;
#define N 2505
#define M 10005
long long n,m,k,a[M],f[M][4],d[N][N],ans;
vector<int> g[N];
bool vis[M];
void Bfs()
{
for(int i = 1;i<=n;i++)
{
memset(vis,false,sizeof(vis));
d[i][i] = 0;
queue<int> q;
q.push(i);
vis[i] = true;
while (!q.empty())
{
int cur = q.front();
q.pop();
if(d[i][cur] == k+1)
break;
for(int j = 0;j<g[cur].size();j++)
{
int v = g[cur][j];
vis[v] = true;
d[i][v] = d[i][cur]+1;
q.push(v);
}
}
}
}
int main()
{
cin>>n>>m>>k;
for(int i = 2;i<=n;i++)
cin>>a[i];
for(int i = 1;i<=m;i++)
{
int x,y;
cin>>x>>y;
g[x].push_back(y);
g[y].push_back(x);
}
memset(d,0x3f,sizeof(d));
Bfs();
for(int i = 2;i<=n;i++)
{
for(int j = 2;j<=n;j++)
{
if(i==j||d[j][1] > k+1||d[j][i]>k+1)
continue;
if(a[j]>a[f[i][1]])
{
f[i][3] = f[i][2];
f[i][2] = f[i][1];
f[i][1] = j;
}
else if(a[j]>a[f[i][2]])
{
f[i][3] = f[i][2];
f[i][2] = j;
}
else if(a[j]>a[f[i][3]])
f[i][3] = j;
}
}
for(int i = 2;i<=n;i++)
{
for(int j = 2;j<=n;j++)
{
if(i==j||d[i][j]>k+1)
continue;
for(int k = 1;k<=3;k++)
{
for(int l = 1;l<=3;l++)
{
int x1 = f[i][k], x4 = f[j][l];
if(x1 == i||x1==j||x1==x4||!x1)
continue;
if(x4==x1||x4==i||x4==j||!x4)
continue;
ans = max(ans, a[x1]+a[i]+a[j]+a[x4]);
}
}
}
}
cout<<ans<<endl;
return 0;
}