#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=2505;
int n,m,k,ans;
int dis[N][N];
int point[N];
struct posi{
int data,idx;
bool operator <(const posi &b) const{
return data>b.data;
}
posi(int _data,int _idx){
data=_data, idx=_idx;
}
};
vector<posi> reach[N];
vector<int> g[N];
queue<int> q;
signed main(){
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
cin>>n>>m>>k;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
dis[i][j]=1e9;
k++;
for(int i=2;i<=n;i++)
cin>>point[i];
for(int i=1;i<=m;i++){
int u,v;
cin>>u>>v;
g[u].push_back(v);
g[v].push_back(u);
}
for(int i=1;i<=n;i++){
q.push(i);
dis[i][i]=0;
while( !q.empty() ){
int now=q.front();
q.pop();
for(auto j:g[now]){
if( dis[i][j]!=1e9 )
continue;
dis[i][j]=dis[i][now]+1;
q.push(j);
}
}
}
for(int i=2;i<=n;i++)
for(int j=2;j<=n;j++){
if( i==j || dis[1][j]>k )
continue;
if( dis[i][j]<=k )
reach[i].push_back(posi(point[j],j));
}
for(int i=1;i<=n;i++)
sort(reach[i].begin(),reach[i].end());
for(int i=2;i<=n;i++)
for(int j=2;j<=n;j++){
if( i==j || dis[i][j]>k || reach[i].size()==0 || reach[j].size()==0 )
continue;
auto fir=reach[i].begin();
for(int k=1;k<=3;k++){
auto fou=reach[j].begin();
if( dis[1][fir->idx]>k || fir->idx==i || fir->idx==j );
else{
for(int l=1;l<=3;l++){
if( dis[fou->idx][1]>k || fir->idx==fou->idx || fou->idx==i || fou->idx==j );
else ans=max(ans,point[i]+point[j]+fir->data+fou->data);
if( next(fou)!=reach[j].end() )
fou=next(fou);
}
}
if( next(fir)!=reach[i].end() )
fir=next(fir);
}
}
cout<<ans;
return 0;
}