#include <bits/stdc++.h>
using std::cin;
using std::cout;
using std::endl;
std::basic_string<int> G[2505];
long long N, M, K, val[2505], dis[2505][2505], ans;
struct Tmp {
long long val;
int pre;
Tmp(long long x = 0, int y = 0) {
val = x, pre = y;
}
} ansmax[2505][3];
std::queue<int> q;
bool flag[2505];
void init(int x) {
dis[x][x] = 0;
flag[x] = 1;
q.push(x);
while (!q.empty()) {
//std::clog<<q.size()<<endl;
int u = q.front();
q.pop();
for (auto v : G[u]) {
if (flag[v])continue;
q.push(v);
dis[x][v] = dis[x][u] + 1;
flag[v] = 1;
}
}
return;
}
void Trimax(Tmp &x, Tmp &y, Tmp &w, Tmp z) {
if (z.val > x.val) w = y, y = x, x = z;
else if (z.val > y.val) w = y, y = z;
else if (z.val>w.val) w = z;
}
void update(int x, int y, int z) {
long long cmpval = val[y] + val[z];
Trimax(ansmax[x][0], ansmax[x][1], ansmax[x][2], Tmp(cmpval, y));
}
bool check(int x1, int y1, int x2, int y2) {
if (x1 == x2 || x1 == y2)return false;
else if (y1 == x2 || y1 == y2)return false;
return true;
}
long long calc(int x, int y) {
long long re = 0;
for (int i = 0; i < 3; i++) {
if (ansmax[x][i].val == 0) continue;
for (int j = 0; j < 3; j++) {
if (ansmax[y][j].val == 0) continue;
if (check(x, ansmax[x][i].pre, y, ansmax[y][j].pre))
re = std::max(re, ansmax[x][i].val + ansmax[y][j].val);
}
}
return re;
}
int main() {
//freopen("holiday.in","r",stdin);
//freopen("holiday.out","w",stdout);
std::ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
cin >> N >> M >> K;
for (int i = 2; i <= N; i++) {
cin >> val[i];
}
for (int i = 1; i <= M; i++) {
int u, v;
cin >> u >> v;
G[u] += v;
G[v] += u;
}
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= N; j++)
flag[j] = 0;
init(i);
}
// for(int i=1;i<=N;i++){
// for(int j=1;j<=N;j++){
// cout<<dis[i][j]<<" ";
// }
// cout<<endl;
// }
for (int i = 2; i <= N; i++) {
if (dis[1][i] > K + 1)continue;
for (int j = 2; j <= N; j++) {
if (dis[i][j] > K + 1 || i == j)continue;
update(j, i, j);
}
}
for (int i = 2; i <= N; i++) {
if (ansmax[i][0].val == 0)continue;
for (int j = 2; j <= N; j++) {
if (i == j || ansmax[j][0].val == 0 || dis[i][j] > K + 1)continue;
ans = std::max(ans, calc(i, j));
}
}
// for(int i=2;i<=N;i++){
// cout<<i<<" "<<ansmax[i][0].pre<<" "<<ansmax[i][0].val<<endl;
// cout<<i<<" "<<ansmax[i][1].pre<<" "<<ansmax[i][1].val<<endl;
// }
cout << ans << endl;
return 0;
}