#include<bits/stdc++.h>
using namespace std;
const int N=5000;
typedef long long ll;
int n,m,k,fl[N][N],vis[N],vis2[N];
ll s[N],ans;
vector<int>G[N];
struct node{
ll w[4];
int r[4];
}md[N];
queue<pair<int,int> >q;
void bfs(int em){
memset(vis,0,sizeof(vis));
// memset(vis2,0,sizeof(vis2));
q.push(make_pair(em,0));
vis[em]=1;
// vis2[em]=1;
while(q.size()){
int u=q.front().first,w=q.front().second;
q.pop();
for(int i=0;i<G[u].size();i++){
int v=G[u][i];
fl[em][v]=1;
// if(u==em) vis2[v]=1;
// if(!vis2[v]) G[em].push_back(v);
// vis2[v]=1;
if(w<k&&(!vis[v])) q.push(make_pair(v,w+1)),vis[v]=1;
}
}
}
int main(){
scanf("%d%d%d",&n,&m,&k);
for(int i=2;i<=n;i++) scanf("%lld",&s[i]);
for(int i=1;i<=m;i++){
int x,y;
scanf("%d%d",&x,&y);
G[x].push_back(y);
G[y].push_back(x);
}
for(int i=1;i<=n;i++) bfs(i);
for(int i=2;i<=n;i++){
for(int j=2;j<=n;j++){
if(i==j) continue;
if(fl[1][i]&&fl[i][j]){
ll sum=s[i]+s[j];
if(sum>md[j].w[1]){
md[j].w[3]=md[j].w[2],md[j].r[3]=md[j].r[2];//这行不要可ac
md[j].w[2]=md[j].w[1],md[j].r[2]=md[j].r[1];//还有这行
md[j].w[1]=sum,md[j].r[1]=i;
}
else if(sum>md[j].w[2]){
md[j].w[3]=md[j].w[2],md[j].r[3]=md[j].r[2];//还有这行
md[j].w[2]=sum,md[j].r[2]=i;
}
else if(sum>md[j].w[3]) md[j].w[3]=sum,md[j].r[3]=i;
}
}
}
for(int i=2;i<=n;i++){
for(int j=2;j<=n;j++){
if(i==j||fl[i][j]==0) continue;
for(int m1=1;m1<=3;m1++){
for(int m2=1;m2<=3;m2++){
if(md[i].r[m1]!=md[j].r[m2]&&md[i].r[m1]!=j&&i!=md[j].r[m2]&&md[i].r[m1]&&md[j].r[m2]) ans=max(ans,md[i].w[m1]+md[j].w[m2]);
}
}
}
}
printf("%lld",ans);
return 0;
}
让我当了小丑好吧……