rt
#include <bits/stdc++.h>
using namespace std;
#define N 2505
typedef long long ll;
ll n, m, z, s[N], f[6][N];
bool vis[6][N][N];
vector<ll> G[N], te[N];
void addEdge(int u, int v) {
G[u].push_back(v);
te[u].push_back(v);
}
int main() {
//freopen("holiday.in", "r", stdin);
//freopen("holiday.out", "w", stdout);
cin >> n >> m >> z;
for (int i = 2; i <= n; i++) {
scanf("%lld", &s[i]);
}
for (int i = 1; i <= m; i++) {
int u, v;
scanf("%d%d", &u, &v);
addEdge(u, v);
addEdge(v, u);
}
//步数内可以达到的景点
if (z != 0) {
for (int i = 1; i <= n; i++) {
//int la = 0;
map<ll, bool> v;
v.clear();
for (int k = 1; k <= z; k++) {
for (int j = 1; j <= k; j++) {
int q = 0, s = G[i].size();
//cout << q << s << la << endl;
for (q = 0; q < s; q++) {
int t = G[i][q];
for (int p = 0; p < te[t].size(); p++) {
//if (!G[i][G[t][p]])
if (te[t][p] != i && !v[te[t][p]]) {
G[i].push_back(te[t][p]);
v[te[t][p]] = 1;
}
}
}
//la = q;
//cout << q << ' ' << G[i].size() << ' ' << la << endl;
}
}
//cout << endl;
}
}
// cout << "sdfsdgsagsfgasdfgasg" << endl;
// for (int i = 1; i <= n; i++) {
// for (int j = 0; j < G[i].size(); j++) {
// cout << G[i][j] << " ";
// }
// cout << endl;
// }
//统计最大值
for (int i = 1; i <= 5; i++) {
for (int j = 0; j <= ((i == 5) ? 1 : n); j++) {
int t = 0;
for (int k = 0; k < G[j].size(); k++) {
if (!vis[i - 1][G[j][k]][j]) {
if (f[i][j] <= f[i - 1][G[j][k]] + s[j])
t = G[j][k];
f[i][j] = max(f[i][j], f[i - 1][G[j][k]] + s[j]);
}
}
vis[i][j][j] = 1;
for (int k = 0; k <= n; k++) {
if (vis[i - 1][t][k])
vis[i][j][k] = 1;
}
// cout << i << " " << j << " " << t << " " << f[i][j] << endl;
// for (int k = 1; k <= n; k++)
// cout << vis[i][j][k];
// cout << endl;
}
}
cout << f[5][1] << endl;
//cout << (sizeof(vis) + sizeof(f) + sizeof(G) + sizeof(te)) / (1 << 20);
return 0;
}