#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<vector>
#include<queue>
#define ll long long
using namespace std;
ll pts[1000001];
vector<ll> ori[1000001];
ll dis[2501],vis[2501];
ll ma[2501][2501];
struct Node{
ll val,x;
};
priority_queue<Node> t;
bool operator <(Node x,Node y){
return x.val>y.val;
}
ll n,m,k;
void dij(ll x){
memset(dis,0x7f,sizeof(dis));
memset(vis,0,sizeof(vis));
dis[x]=1;
t.push((Node){1,x});
while(!t.empty()){
ll u=t.top().x;
t.pop();
if(vis[u]) continue;
vis[u]++;
for(ll i=0;i<ori[u].size();i++){
ll v=ori[u][i];
if(dis[v]>dis[u]+1){
dis[v]=dis[u]+1;
t.push((Node){dis[v],v});
}
}
}
for(ll i=1;i<=n;i++){
if(dis[i]<=k+2){
ma[i][x]=1;
ma[x][i]=1;
}
}
}
ll fm[100001][6];
ll fr[100001][6];
int main(){
ll u,v,m;
cin>>n>>m>>k;
for(ll i=2;i<=n;i++) cin>>pts[i];
for(ll i=1;i<=m;i++){
cin>>u>>v;
ori[u].push_back(v);
ori[v].push_back(u);
}
for(ll i=1;i<=n;i++) dij(i);
for(ll i=2;i<=n;i++){
for(ll j=2;j<=n;j++){
if(i!=j && ma[i][j] && ma[1][j]){
if(pts[j]>fm[i][1]){
fm[i][3]=fm[i][2];
fr[i][3]=fr[i][2];
fm[i][2]=fm[i][1];
fr[i][2]=fr[i][1];
fm[i][1]=pts[j]+pts[i];
fr[i][1]=j;
}
else if(pts[j]>fm[i][2]){
fm[i][3]=fm[i][2];
fr[i][3]=fr[i][2];
fm[i][2]=pts[j]+pts[i];
fr[i][2]=j;
}
else if(pts[j]>fm[i][3]){
fm[i][3]=pts[j]+pts[i];
fr[i][3]=j;
}
}
}
}
ll ans=0;
for(ll i=2;i<=n;i++){
for(ll j=2;j<=n;j++){
if(i==j || !ma[i][j]) continue;
for(int p=1;p<=3;p++){
for(int q=1;q<=3;q++){
if(!fr[i][p] || !fr[j][q]) continue;
if(fr[i][p]==j || fr[i][p]==fr[j][q] || i==fr[j][q]) continue;
ans=max(ans,fm[i][p]+fm[j][q]);
}
}
}
}
cout<<ans<<endl;
return 0;
}