#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int MAXN = 2505;
const int MAXM = 1e4 + 5;
int n, m, k;
LL w[MAXN], ans;
struct Edge {
int to, nxt;
} e[MAXM * 2];
int h[MAXN], cnt;
void addedge(int u, int v) {
e[cnt].to = v, e[cnt].nxt = h[u], h[u] = cnt++;
}
int dis[MAXN][MAXN], f[MAXN][5];
void bfs(int s) {
queue<int> q;
q.push(s);
dis[s][s] = 0;
while (!q.empty()) {
int u = q.front();
q.pop();
for (int i = h[u]; ~i; i = e[i].nxt) {
int v = e[i].to;
if (~dis[s][v]) continue;
dis[s][v] = dis[s][u] + 1;
q.push(v);
}
}
}
LL check(int a, int b, int c, int d) {
if (!a || !b || !c || !d) return 0;
if (a == b || a == c || a == d || b == c || b == d || c == d) return 0;
if (dis[a][b] > k || dis[c][d] > k || dis[1][a] > k || dis[1][d] > k) return 0;
return w[a] + w[b] + w[c] + w[d];
}
int main() {
memset(h, -1, sizeof(h));
memset(dis, -1, sizeof(dis));
cin >> n >> m >> k;
k++;
for (int i = 2; i <= n; i++)
cin >> w[i];
for (int i = 1; i <= m; i++) {
int u, v;
cin >> u >> v;
addedge(u, v);
addedge(v, u);
}
for (int i = 1; i <= n; i++)
bfs(i);
for (int u = 2; u <= n; u++)
for (int v = 2; v <= n; v++)
if (~dis[u][v] && ~dis[1][v] && dis[u][v] <= k && dis[1][v] <= k) {
int x = v;
if (w[x] > w[f[u][1]]) swap(x, f[u][1]);
if (w[x] > w[f[u][2]]) swap(x, f[u][2]);
if (w[x] > w[f[u][3]]) swap(x, f[u][3]);
}
for (int b = 2; b <= n; b++)
for (int c = 2; c <= n; c++)
if (~dis[b][c] && dis[b][c] <= k && b != c)
for (int i = 1; i <= 3; i++)
for (int j = 1; j <= 3; j++)
ans = max(ans, check(f[b][i], b, c, f[c][j]));
cout << ans << endl;
return 0;
}