#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2510;
int n,m,k;
bool con[N][N];
vector<int>l[N];
int w[N];
int dis[N];
vector<int> near_home;
int can_go[N][3];
void Dis(int u) {
for(int i=1ll; i<=n; i++)dis[i]=-2ll;
dis[u]=-1ll;
queue<int>q;
q.push(u);
while(q.size()) {
int x=q.front();
q.pop();
if(dis[x]>k)break;
for(int i=0ll; i<l[x].size(); i++) {
int j=l[x][i];
if(dis[j]!=-2ll)continue;
dis[j]=dis[x]+1ll;
q.push(j);
}
}
return;
}
signed main() {
cin>>n>>m>>k;
for(int i=2ll; i<=n; i++)cin>>w[i];
while(m--) {
int x,y;
cin>>x>>y;
l[x].push_back(y);
l[y].push_back(x);
}
Dis(1ll);
for(int i=1ll; i<=n; i++)if(dis[i]!=-2ll&&dis[i]<=k)near_home.push_back(i);
for(int i=2ll; i<=n; i++) {
Dis(i);
for(int j=1ll;j<=n;j++)if(dis[j]!=-2ll&&dis[j]<=k)con[i][j]=1ll;
for(int j=0ll; j<near_home.size(); j++) {
int t=near_home[j];
if(t==i||dis[t]==-2ll||dis[t]>k)continue;
if(w[t]>w[can_go[i][0ll]]) can_go[i][2ll]=can_go[i][1ll],can_go[i][1ll]=can_go[i][0ll],can_go[i][0ll]=t;
else if(w[t]>w[can_go[i][1ll]])can_go[i][2ll]=can_go[i][1ll],can_go[i][1ll]=t;
else if(w[t]>w[can_go[i][0ll]])can_go[i][2ll]=t;
}
}
int ans=0ll;
for(int b=2ll;b<=n;b++) {
for(int c=b+1ll;c<=n;c++) {
if(!con[b][c])continue;
int a=can_go[b][0ll],d=can_go[c][0ll],ai=0ll,di=0ll;
if(a==c)a=can_go[b][++ai];
if(d==b)d=can_go[c][++di];
if(a==d) {
if(w[a]-w[can_go[b][ai+1ll]]>w[d]-w[can_go[c][di+1ll]])d=can_go[c][++di];
else a=can_go[b][++ai];
}
if(a==c)a=can_go[b][++ai];
if(d==b)d=can_go[c][++di];
if(!a||!d)continue;
ans=max(w[a]+w[b]+w[c]+w[d],ans);
}
}
cout<<ans<<endl;
return 0ll;
}