#include<bits/stdc++.h>
using namespace std;
int h[100001], nxt[500001], val[500001], zd[500001], cnt = 0;
int n, m, s, k;
long long dis[100001];
bool inq[100001];
int q[1000001], f, e;
long long pval[100001], pval2[100005], ans = 0;
int vis[5] = {};
bool ed[10001][10001];
int zhuan[10001][10001];
vector<int>ljb[10001];
void addedge(int a, int b, int c) {
cnt++;
val[cnt] = c, zd[cnt] = b, nxt[cnt] = 0;
nxt[cnt] = h[a];
h[a] = cnt;
}
void dfs(int i, int dep, long long valu, int vis[5]) {
register int summmm = 0;
for (register int qwq = dep; qwq < 4; qwq++)summmm += pval2[qwq];
if (summmm + valu < ans)return;
for (register int qaq = 0; qaq <= 5; qaq++)if (i == vis[qaq])return;
vis[dep] = i;
if (dep == 4) {
for (register int p = 0; p < ljb[i].size(); p++)
if (ljb[i][p] == 1) {
ans = max(ans, valu);
}
return;
}
for (register int p = 0; p < ljb[i].size(); p++) {
dfs(ljb[i][p], dep + 1, valu + pval[ljb[i][p]], vis);
}
}
bool cmp(int a, int b) {
return a > b;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
memset(zhuan, -1, sizeof(zhuan));
cin >> n >> m >> k;
for (register int i = 2; i <= n; i++) {
cin >> pval[i];
pval2[i] = pval[i];
}
for (register int i = 1; i <= m; i++) {
register int a, b;
cin >> a >> b;
addedge(a, b, 1);
addedge(b, a, 1);
ed[a][b] = 1;
ed[b][a] = 1;
zhuan[a][b] = 0;
zhuan[b][a] = 0;
}
if (k == 0 && n <= 20) {
unsigned long long res = 0;
for (register int a = 2; a <= n; a++) {
for (register int b = 2; b <= n; b++) {
if (b == a)continue;
for (register int c = 2; c <= n; c++) {
if (c == a || c == b)continue;
for (register int d = 2; d <= n; d++) {
if (d == a || d == b || d == c)continue;
if (ed[1][a] == 1) {
if (ed[a][b] == 1) {
if (ed[b][c] == 1) {
if (ed[c][d] == 1) {
if (ed[d][1] == 1) {
if (pval[a] + pval[b] + pval[c] + pval[d] > res)res = pval[a] + pval[b] + pval[c] + pval[d];
}
}
}
}
}
}
}
}
}
cout << res;
} else if (n > 20) {
for (register int s = 1; s <= n; s++) {
memset(dis, -1, sizeof(dis));
memset(inq, 0, sizeof(inq));
dis[s] = 0, inq[s] = 1;
q[1] = s, f = 1, e = 1;
while (f <= e) {
register int u = q[f++];
for (register int p = h[u]; p; p = nxt[p]) {
register long long v = zd[p], c = val[p];
if (dis[v] == -1 || dis[v] > dis[u] + c) {
dis[v] = dis[u] + c;
if (inq[v] == 0)q[++e] = v, inq[v] = 1;
}
}
}
for (register int i = 1; i <= n; i++) {
if (i == s || dis[i] > k + 1 || dis[i] == -1)continue;
ljb[s].push_back(i);
}
}
sort(pval2 + 1, pval2 + n + 1, cmp);
dfs(1, 0, 0, vis);
cout << ans;
} else {
for (register int a = 1; a <= n; a++) {
for (register int b = 1; b <= n; b++) {
if (b == a)continue;
for (register int c = 1; c <= n; c++) {
if (c == a || c == b)continue;
if (ed[a][b] && ed[b][c]) {
ed[a][c] = 1;
if (zhuan[a][c] == -1 || zhuan[a][b] + zhuan[b][c] + 1 < zhuan[a][c])zhuan[a][c] = zhuan[a][b] + zhuan[b][c] + 1;
}
}
}
}
unsigned long long res = 0;
for (register int a = 2; a <= n; a++) {
for (register int b = 2; b <= n; b++) {
if (b == a)continue;
for (register int c = 2; c <= n; c++) {
if (c == a || c == b)continue;
for (register int d = 2; d <= n; d++) {
if (d == a || d == b || d == c)continue;
if (ed[1][a] == 1) {
if (ed[a][b] == 1) {
if (ed[b][c] == 1) {
if (ed[c][d] == 1) {
if (ed[d][1] == 1) {
if (zhuan[1][a] > k || zhuan[a][b] > k || zhuan[b][c] > k || zhuan[c][d] > k || zhuan[d][1] > k)continue;
if (pval[a] + pval[b] + pval[c] + pval[d] > res) {
res = pval[a] + pval[b] + pval[c] + pval[d];
}
}
}
}
}
}
}
}
}
}
cout << res;
}
}