I believe it's right!
#include<bits/stdc++.h>
#define int long long
#define printlf(x) print(x),putchar('\n')
#define printsp(x) print(x),putchar(' ')
using namespace std;
inline int read(){
int x=0;bool w=0;char c=getchar();
while(!isdigit(c)) w|=c=='-',c=getchar();
while(isdigit(c)) x=(x<<1)+(x<<3)+(c^48),c=getchar();
return w?-x:x;
}
inline void print(int x){
if(x<0) putchar('-'),x=-x;
if(x>9) print(x/10);
putchar('0'+x%10);
}
const int N=2505,M=1e4+5,INF=INT_MAX;
int a[N],head[N],dis[N][N],vis[N],flag[N][N];
int n,m,k,tot,ans;
struct edge{
int to,nxt,dis;
}Edge[M<<1];
struct node{
int now,dis;
bool operator <(const node &x) const{
return x.dis<dis;
}
};
inline void add(int u,int v,int w){
Edge[++tot].to=v;
Edge[tot].dis=w;
Edge[tot].nxt=head[u];
head[u]=tot;
}
inline void Dijkstra(int s){
priority_queue<node> q;
for(register int i=1;i<=n;++i) dis[s][i]=INF;
dis[s][s]=0;
memset(vis,0,sizeof(vis));
q.push((node){s,0});
while(!q.empty()){
int x=q.top().now;q.pop();
if(vis[x]) continue;
vis[x]=1;
for(register int i=head[x];i;i=Edge[i].nxt){
int v=Edge[i].to,w=Edge[i].dis;
if(dis[s][x]+w<dis[s][v]){
dis[s][v]=dis[s][x]+w;
q.push((node){v,dis[s][v]});
}
}
}
}
priority_queue<pair<int,int> > getmax[N];
#define Sec second
#define Fir first
vector<int> gop[N];
signed main(){
freopen("holiday.in","r",stdin);
freopen("holiday.out","w",stdout);
n=read(),m=read(),k=read();
for(register int i=2;i<=n;++i) a[i]=read();
for(register int i=1;i<=m;++i){
int u=read(),v=read(),w=1;
add(u,v,w),add(v,u,w);
}
// cout<<" add over\n";
for(register int i=1;i<=n;++i){
Dijkstra(i);
}
// for(register int i=1;i<=n;++i){
// for(register int j=1;j<=n;++j)
// cout<<dis[i][j]<<' ';cout<<"dis\n";
// }
for(register int i=1;i<=n;++i){
for(register int j=1;j<=n;++j){
if(i==j) continue;
if(dis[i][j]<=k+1){
// cout<<i<<' '<<j<<" conect\n";
flag[i][j]=1;
gop[i].push_back(j);
}
}
}
for(register int i=2;i<=n;++i){
for(register int j=2;j<=n;++j){
if(flag[i][j] && flag[1][j])
getmax[i].push({a[j],j});
}
}
// for(register int i=1;i<=n;++i){
// for(register int j=1;j<=n;++j)
// cout<<flag[i][j]<<' ';cout<<" flag\n";
// }
for(register int i=0;i<gop[1].size();++i){
int fir=gop[1][i];
for(register int j=0;j<gop[fir].size();++j){
int sec=gop[fir][j];
if(fir==sec) continue;
for(register int k=0;k<gop[sec].size();++k){
int thi=gop[sec][k];
if(fir==thi || sec==thi) continue;
int l=0;pair<int,int> o[3];
while(!getmax[thi].empty() && (getmax[thi].top().Sec==fir || getmax[thi].top().Sec==sec || getmax[thi].top().Sec==thi))
o[l++]=getmax[thi].top(),getmax[thi].pop();
if(getmax[thi].empty()){
for(register int u=0;u<l;++u) getmax[thi].push(o[u]);
continue;
}
int gm=getmax[thi].top().Fir;
for(register int u=0;u<l;++u) getmax[thi].push(o[u]);
ans=max(ans,gm+a[fir]+a[sec]+a[thi]);
// cout<<fir<<' '<<sec<<' '<<thi<<' '<<gm<<' '<<a[fir]<<' '<<a[sec]<<' '<<a[thi]<<' '<<ans<<endl;
}
}
}
print(ans);
return 0;
}