#include <bits/stdc++.h>
using namespace std;
typedef unsigned long long ll;
const int N = 2510;
int n, m, k, f[N][N];
int g[N][3];
ll s[N];
vector<int> G[N];
queue<int> q;
void bfs(int s){
q.push(s);
f[s][s] = 0;
while(!q.empty()){
int x = q.front();
q.pop();
for(int i = 0; i < G[x].size(); ++ i){
int y = G[x][i];
if(f[s][y] == 0x3f3f3f3f && y != s){
f[s][y] = f[s][x] + 1;
q.push(y);
}
}
}
}
ll jdge(int a, int b, int c, int d){
if(a == c || a == d || d == b || d == a){
return 0;
}
return s[a] + s[b] + s[c] + s[d];
}
int main(){
scanf("%d", &n);
scanf("%d", &m);
scanf("%d", &k);
for(int i = 2; i <= n; ++ i){
scanf("%lld", &s[i]);
}
for(int i = 1; i <= m; ++ i){
int x, y;
scanf("%d", &x);
scanf("%d", &y);
G[x].push_back(y);
G[y].push_back(x);
}
memset(f, 0x3f, sizeof(f));
for(int i = 1; i <= n; ++ i){
bfs(i);
}
for(int i = 2; i <= n; ++ i){
for(int j = 2; j <= n; ++ j){
if(j == i){
continue;
}
if(f[1][j] - 1 <= k && f[j][i] - 1 <= k){
if(s[j] > s[g[i][0]]){
g[i][2] = g[i][1];
g[i][1] = g[i][0];
g[i][0] = j;
} else if(s[j] > s[g[i][1]]){
g[i][2] = g[i][1];
g[i][1] = j;
} else if(s[j] > s[g[i][2]]){
g[i][2] = j;
}
}
}
}
ll ans = 0;
for(int B = 2; B <= n; ++ B){
for(int C = 2; C <= n; ++ C){
if(!g[B][0] || !g[C][0] || B == C || f[B][C] - 1 > k){
continue;
}
for(int i = 0; i < 3; ++ i){
for(int j = 0; j < 3; ++ j){
ans = max(ans, jdge(g[B][i], B, C, g[C][j]));
}
}
}
}
printf("%lld\n", ans);
return 0;
}