#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<vector>
using namespace std;
#define int long long
int n, m, k;
const int maxn = 2600;
int win[maxn];
vector<int>g[maxn];
int numk[maxn][maxn];
queue<int>q;
void bfs(int x) {
numk[x][x] = -1;
q.push(x);
while(!q.empty()) {
int u = q.front();
q.pop();
for(int i = 0; i < g[u].size(); i++) {
int v = g[u][i];
if(numk[x][v] > numk[x][u] + 1) {
numk[x][v] = numk[x][u] + 1;
q.push(v);
}
}
}
return;
}
struct node {
int x, win;
bool operator < (const node a) const{
return win > a.win;
}
};
vector<node>f[maxn];
signed main() {
cin >> n >> m >> k;
for(int i = 2; i <= n; i++) {
cin >> win[i];
}
for(int i = 1; i <= m; i++) {
int u, v;
cin >> u >> v;
g[u].push_back(v);
g[v].push_back(u);
}
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= n; j++) {
numk[i][j] = 1e9;
}
}
for(int i = 1; i <= n; i++) {
bfs(i);
}
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= n; j++) {
if(i != j && numk[i][j] <= k && numk[j][1] <= k) {
f[i].push_back({j, win[j]});
sort(f[i].begin() , f[i].end() );
if(f[i].size() > 4) {
f[i].pop_back();
}
}
}
}
int ans = 0;
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= n; j++) {
if(i == j) continue;
for(int f1 = 0; f1 < f[i].size(); f1++) {
for(int f2 = 0; f2 < f[j].size(); f2++) {
int a = f[i][f1].x, b = f[j][f2].x;
if(i != a && a != j && a != b && b != i && b != j && numk[i][a] <= k && numk[j][b] <= k && numk[i][j] <= k) {
ans = max(ans, win[i] + win[j] + win[a] + win[b]);
}
}
}
}
}
cout << ans;
return 0;
}