#include<iostream>
#include<vector>
#include<cstring>
#include<queue>
using namespace std;
using ll = long long;
const int N=2505;
int n, m, k, vis[N][N], V[N];
vector<int> T[N], E[N];
ll v[N], dis[N], f[N][4], Fd[N][4];
void Read(){
cin >> n >> m >> k;
for(int i = 2; i <= n; ++i)
cin >> v[i];
for(int i = 1; i <= m; ++i){
int a, b;
cin >> a >> b;
E[a].push_back(b);
E[b].push_back(a);
}
}
void Bfs(int i){
memset(dis, 0x3f, sizeof dis);
dis[i] = -1;
queue<int> q;
q.push(i);
while(!q.empty()){
int u = q.front();
q.pop();
for(auto v:E[u]){
if(dis[v] > dis[u] + 1){
dis[v] = dis[u] + 1;
q.push(v);
}
}
}
for(int j = 1; j <= n; ++j){
if(dis[j] <= k && j != i){
vis[i][j] = 1;
T[i].push_back(j);
}
}
}
void Get(int i){
memset(V, 0, sizeof V);
for(auto j:T[i]){
if(j == 1 || V[j])
continue;
V[j] = 1;
if(v[j] >= f[i][1]){
f[i][3] = f[i][2], Fd[i][3] = Fd[i][2];
f[i][2] = f[i][1], Fd[i][2] = Fd[i][1];
f[i][1] = v[j], Fd[i][1] = j;
}
else if(v[j] >= f[i][2]){
f[i][3] = f[i][2], Fd[i][3] = Fd[i][2];
f[i][2] = v[j], Fd[i][2] = j;
}
else if(v[j] >= f[i][3]){
f[i][3] = v[j], Fd[i][3] = j;
}
}
}
void Init(){
for(int i = 1; i <= n; ++i)
Bfs(i);
for(int i = 1; i <= n; ++i)
Get(i);
}
void Solve(){
ll ans=0;
for(int a = 2; a <= n; ++a){
if(!vis[1][a])
continue;
for(int c = 2; c <= n; ++c){
if(a == c)
continue;
for(int i = 1; i < 4; ++i){
for(int j = 1; j < 4; ++j){
int b = Fd[a][i];
int d = Fd[c][j];
if(b == 1 || d == 1 || b == c || d == a || b == d || !vis[d][1] || !vis[b][c])
continue;
ans = max(ans, v[a] + v[b] + v[c] + v[d]);
}
}
}
}
cout << ans;
}
int main(){
ios_base::sync_with_stdio(false);
cin.tie(NULL),cout.tie(NULL);
Read();
Init();
Solve();
return 0;
}