#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
namespace ljx_9420yy {
const int maxn = 2505, maxm = 10005;
int vis[maxn][maxn], map[maxn][maxm], n, m, k, max2, max1, len[maxn];
struct NOI {
int ans, id;
} w[maxn], w2[maxn];
bool cmp(NOI a, NOI b) {
return a.ans > b.ans;
}
void dfs(int x, int y, int cnt) {
if(cnt>k) return ;
if(x != y) {
vis[x][y] = 1;
vis[y][x] = 1;
}
for(int i=1; i<=len[y]; i++) {
if(vis[x][ map[y][i] ] == 0 || vis[ map[y][i] ][x] == 0) {
if( x != map[y][i] ) {
vis[x][ map[y][i] ] = 1;
vis[ map[y][i] ][x] = 1;
dfs(x, map[y][i], cnt+1);
}
}
}
}
int main() {
cin>> n>> m>> k;
for(int i=2; i<=n; i++) {
cin>> w[i].ans;
w2[i].id = w[i].id = i;
w2[i].ans = w[i].ans;
}
sort(w2+2, w2+2+n, cmp);
w[1].id = w2[1].id = 1;
for(int i=2; i<=n; i++) {
w[w2[i].id].id = i;
}
for(int i=1; i<=m; i++) {
int x, y;
cin>> x>> y;
map[w[x].id][++len[x]] = w[y].id;
map[w[y].id][++len[y]] = w[x].id;
}
for(int i=1; i<=n; i++) {
dfs(i, i, 0);
}
max2 = w2[1].ans + w2[2].ans + w2[3].ans + w2[4].ans;
for(int i=2; i<=n; i++) {
if(vis[1][i] == 0) continue;
for(int j=2; j<=n; j++) {
if(i == j) continue;
if(vis[i][j] == 0) continue;
for(int k=2; k<=n; k++) {
if(k == i || k == j) continue;
if(vis[j][k] == 0) continue;
for(int l=2; l<=n; l++) {
if(l == k || l == j || l == i) continue;
if(vis[k][l] == 1 && vis[l][1] == 1) {
max1 = max(max1, w2[i].ans + w2[j].ans + w2[k].ans + w2[l].ans);
if(max1 == max2) {
cout<< max1;
return 0;
}
break;
}
}
}
}
}
cout<< max1;
return 0;
}
}
int main() {
ljx_9420yy::main();
return 0;
}