#include <bits/stdc++.h>
#define int long long
using namespace std;
const int _ = 2505;
inline int read()
{
int w = 1,f = 0;
char c = getchar();
while(c < '0' or c > '9')
{
if(c == '-') w = -1;
c = getchar();
}
while(c >= '0' and c <= '9')
{
f = f * 10 + c - '0';
c = getchar();
}
return w * f;
}
int n,m,k,ans;
int max1,max0,max_1;
int scr[_];
vector <int> G[_];
int dis0[_],dis[_][_];
bool vis[_];
struct fs
{
int v,point;
bool operator <(const fs &o) const{return v < o.v;};
}_fs[_][4];
void bfs0()
{
queue <int> q;q.push(1);
while(!q.empty())
{
int u = q.front();q.pop();
for(int v : G[u])
{
if(v == 1 or dis0[v]) continue;
dis0[v] = dis0[u] + 1;
if(dis0[v] <= k) q.push(v);
}
}
}
void bfs(int z)
{
queue <int> q;q.push(z);
while(!q.empty())
{
int u = q.front();q.pop();
for(int v : G[u])
{
if(v == z or dis[z][v]) continue;
dis[z][v] = dis[z][u] + 1;
if(dis0[v] <= k and dis0[v] and v != 1 and dis[z][v] <= k)
{
fs x;
x.v = scr[v] + scr[z],x.point = v;
_fs[z][0] = x;
sort(_fs[z],_fs[z] + 3 + 1);
}
if(dis[z][v] <= k)
q.push(v);
}
}
}
signed main()
{
n = read();
m = read();
k = read();
++k;
for(int i = 2;i <= n;i++)
scr[i] = read();
for(int i = 1;i <= m;i++)
{
int u = read(),v = read();
G[u].push_back(v);
G[v].push_back(u);
}
bfs0();
for(int i = 2;i <= n;i++)
bfs(i);
for(int i = 2;i <= n;i++)
{
for(int j = 2;j < i;j++)
{
if(dis[i][j] > k or dis[i][j] == 0) continue;
for(int x = 1;x <= 3;x++)
{
for(int y = 1;y <= 3;y++)
{
if(_fs[i][x].point != j and _fs[j][y].point != i and _fs[i][x].point != _fs[j][y].point)
ans = max(ans,_fs[i][x].v + _fs[j][y].v);
}
}
}
}
cout << ans;
return 0;
}