#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=2510,M=1e5+10;
int he[M],e[M],ne[M],w[M],idx=0;
void add(int x,int y,int z){
w[++idx]=z;e[idx]=y;ne[idx]=he[x];he[x]=idx;
}
int d[N][N];
int a[N],vis[N];
int n,m,k;
typedef pair<int,int>pll;
queue<int>q;
void bfs(int x)
{
for (int i=1;i<=n;++i) vis[i]=0,d[x][i]=1e18+10;
vis[x]=1,d[x][x]=0,q.push(x);
while(!q.empty())
{
int top=q.front();q.pop();
for (int i=he[top];i;i=ne[i])
if (!vis[e[i]]&&d[x][top]<=k+1)
vis[e[i]]=1,d[x][e[i]]=d[x][top]+1,q.push(e[i]);
}
return;
}
struct node{
int x,y,ans;
}fuckccf[M];
int cmp(node x,node y){
return x.ans<y.ans;
return x.x<y.x;
return x.y<y.y;
}
main(){
cin>>n>>m>>k;
for(int i=2;i<=n;i++)cin>>a[i];
for(int i=1;i<=m;i++){
int x,y;
cin>>x>>y;
add(x,y,1);add(y,x,1);
}
for(int i=1;i<=n;i++){
bfs(i);
}
int sum=0;
for(int i=2;i<=n;i++){
if(d[1][i]>k+1)continue;
for(int j=2;j<=n;j++){
if(j==i)continue;
if(d[i][j]>k+1)continue;
else{
fuckccf[++sum]={i,j,a[i]+a[j]};
}
}
}
sort(fuckccf+1,fuckccf+sum+1,cmp);
int ans=0;
for(int i=1;i<=sum;i++){
for(int j=1;j<=sum;j++){
if(fuckccf[i].x==fuckccf[j].y)continue;
if(fuckccf[i].x==fuckccf[j].x)continue;
if(fuckccf[i].y==fuckccf[j].y)continue;
if(fuckccf[i].y==fuckccf[j].x)continue;
if(d[fuckccf[i].y][fuckccf[j].y]<=k+1){
if(fuckccf[i].ans+fuckccf[j].ans>ans){
ans=max(ans,fuckccf[i].ans+fuckccf[j].ans);
}
}
}
}
cout<<ans<<endl;
return 0;
}