#include<bits/stdc++.h>
using namespace std;
#define int long long
int n, m, k, val[2502];
vector<int> lnk[2502];
int dist[2502][2502];
void init1(){
bool vis[2502];
for(int i = 1; i <= n; i++){
queue<int> q;
q.push(i);
memset(vis, 0, n+2);
vis[i] = 1;
dist[i][i] = 0;
while(!q.empty()){
int u = q.front();
q.pop();
for(int v : lnk[u]){
if(vis[v]) continue;
vis[v] = 1;
dist[i][v] = dist[i][u] + 1;
q.push(v);
}
}
}
}
int f[2502][3];
void init2(){
for(int i = 2; i <= n; i++){
for(int j = 2; j <= n; j++){
if(i == j) continue;
if(dist[1][j] <= k+1 && dist[i][j] <= k+1){
int j2 = j;
if(val[j2] > val[f[i][0]]){
swap(j2, f[i][0]);
}
if(val[j2] > val[f[i][1]]){
swap(j2, f[i][1]);
}
if(val[j2] > val[f[i][2]]){
swap(j2, f[i][2]);
}
}
}
}
}
int calc(){
int ans = 0;
for(int b = 1; b <= n; b++){
for(int c = 1; c <= n; c++){
if(b != c && dist[b][c] <= k+1){
for(int a : f[b]){
for(int d : f[c]){
if(a!=0 && b!=0 && a!=c && b!=d && a!=d){
ans = max(ans, val[a]+val[b]+val[c]+val[d]);
}
}
}
}
}
}
return ans;
}
signed main(){
cin >> n >> m >> k;
for(int i = 2; i <= n; i++){
cin >> val[i];
}
for(int i = 1; i <= m; i++){
int u, v;
cin >> u >> v;
lnk[u].push_back(v);
lnk[v].push_back(u);
}
init1();
init2();
cout << calc();
return 0;
}