#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read() {int flag = 0,ans = 0;char s = getchar();while (s>'9' || s<'0'){if (s == '-'){ flag = -1;}s = getchar();}while (s<='9' && s>='0'){ans*=10;ans+=s-'0';s = getchar();}if (flag == 0) return ans;return -ans;}
const int N = 2500 + 10;
int b[N][4],a[N],vis[N],dis[N][N],n,m,k,ans;
vector<int> G[N];
struct node{
int u,step;
};
queue<node> que;
void bfs(int uu){
while (!que.empty()) que.pop();
memset(vis,0,sizeof vis);
que.push({uu,0});
while (!que.empty()){
node s = que.front();
que.pop();
if (vis[s.u]) continue;
dis[uu][s.u] = s.step;
vis[s.u] = 1;
for (int i = 0;i < G[s.u].size(); ++ i){
int j = G[s.u][i];
if (!vis[j]){
que.push({j,s.step + 1});
}
}
}
}
signed main(){
n = read();
m = read();
k = read();
for (int i = 2;i <= n;++i){
a[i] = read();
}
for (int j = 1;j<=m;++j){
int u = read();
int v = read();
G[u].push_back(v);
G[v].push_back(u);
}
for (int i = 1;i<=n;++i){
bfs(i);
}
k ++;
memset(b,0,sizeof b);
for (int i = 2;i<=n;++i){
for (int j = 2;j<=n;++j){
if (i == j) continue;
if (dis[i][j] <= k && dis[1][j] <= k){
if (a[j] > a[b[i][1]]){
b[i][3] = b[i][2];
b[i][2] = b[i][1];
b[i][1] = j;
}
else if (a[j] > a[b[i][2]]){
b[i][3] = b[i][2];
b[i][2] = j;
}
else if (a[j] > a[b[i][3]]){
b[i][3] = j;
}
}
}
}
for (int i = 2;i<=n;++i){
for (int j = 2;j<=n;++j){
if (i == j) continue;
if (dis[i][j] > k) continue;
for (int B = 1;B<=3;++B){
if (!b[i][B]) break;
for (int C = 1;C<=3;++C){
if (!b[j][C]) break;
if (b[i][B] == b[j][C]) continue;
if (b[i][B] == j) continue;
if (b[j][C] == i) continue;
ans = max(ans,a[b[i][B]] + a[i] + a[j] + a[b[j][C]]);
}
}
}
}
cout<<ans;
return 0;
}