#include<bits/stdc++.h>
using namespace std;
const int N=2053,M=10003,INF=0x3f3f3f3f;
int vis[N],n,m,k,w[N],f[N][5],first[N],tot=0,dis[N][N],ans=0;
struct node{
int v,ne;
}e[M<<1];
void add(int u,int v){
e[++tot]=(node){v,first[u]};first[u]=tot;
}
void bfs(int stt){
queue<pair<int,int> > q;
for(int i=1;i<=n;++i) dis[stt][i]=INF,vis[i]=0;
dis[stt][stt]=0;
vis[stt]=1;q.push(make_pair(stt,0));
while(!q.empty()){
int u=q.front().first,step=q.front().second;
q.pop();
for(int i=first[u];i;i=e[i].ne){
int v=e[i].v;
if(!vis[v]){
dis[stt][v]=step+1;
vis[v]=1;
q.push(make_pair(v,step+1));
}
}
}
}
int main(){
scanf("%d%d%d",&n,&m,&k);
w[0]=-INF;
for(int i=2;i<=n;++i) scanf("%d",&w[i]);
for(int i=1;i<=m;++i){
int u,v;
scanf("%d%d",&u,&v);
add(u,v);add(v,u);
}
for(int i=1;i<=n;++i) bfs(i);
memset(f,0,sizeof(f));
for(int i=2;i<=n;++i){
for(int j=2;j<=n;++j){
if(i==j) continue;
if(dis[i][j]<=k+1&&dis[1][j]<=k+1){
if(w[j]>w[f[i][1]]) swap(f[i][2],f[i][3]),swap(f[i][1],f[i][2]),f[i][1]=j;
else if(w[j]>w[f[i][2]]) swap(f[i][2],f[i][3]),f[i][2]=j;
else if(w[j]>w[f[i][3]]) f[i][3]=j;
}
}
}
for(int i=2;i<=n;++i){
for(int j=2;j<=n;++j){
if(i==j||dis[i][j]>k+1) continue;
int k2=i,k3=j,s1=1,s2=1,k1=f[k2][s1],k4=f[k3][s2];
if(k1==k3) k1=f[k2][++s1];
if(k4==k2) k4=f[k3][++s2];
if(k1==k4){
if(w[f[k2][s1+1]]>=w[f[k3][s2+1]]) k4=f[k3][++s2];
else k1=f[k2][++s1];
}
if(!k1||!k4) continue;
ans=max(ans,w[k1]+w[k2]+w[k3]+w[k4]);
}
}
printf("%d",ans);
return 0;
}
有无巨佬垂青,指点一二。