RT。
#include <bits/stdc++.h>
#define gc IO::fastgc()
#define pc(c) IO::fastpc(c)
using namespace std;
typedef long long ll;
constexpr unsigned N=2507,M=20007;
constexpr ll INF=0x3f3f3f3f3f3f3f3f;
int n,m,d;
ll w[N];
vector<int> g[N];
ll dis[N][N],ans;
vector<int> to[N],ss;
inline void bfs(int s){
// printf("s=%d\n",s);
for(int i=1;i<=n;++i){
dis[s][i]=INF;
}
queue<int> q;
dis[s][s]=0;
q.emplace(s);
while(!q.empty()){
int u=q.front();
q.pop();
for(auto v:g[u]){
if(dis[s][v]!=INF) continue;
dis[s][v]=dis[s][u]+1;
q.emplace(v);
}
}
}
void init2(){
for(int i=2;i<=n;++i){
if(dis[1][i]>d) continue;
ss.emplace_back(i);
for(int j=2;j<=n;++j){
if(j==i) continue;
if(dis[i][j]<=d){
to[i].emplace_back(j);
}
}
}
for(auto i:ss){
sort(to[i].begin(),to[i].end(),
[](int a,int b)->bool{
return w[a]>w[b];
}
);
// for(auto j:to[i]){
// printf("%d-->%d\n",i,j);
// }
}
}
void init4(){
auto check=[&](int u,int v)->void{
// printf("check(%d,%d)\n",u,v);
int su=min((int)to[u].size(),3),sv=min((int)to[v].size(),3);
for(int i=0;i<su;++i){
for(int j=0;j<sv;++j){
int a=to[u][i],b=to[v][j];
if(a==b||a==u||a==v||b==u||b==v||dis[a][b]>d) continue;
// printf("check: %d %d %d %d\n",u,a,b,v);
ans=max(ans,w[u]+w[v]+w[a]+w[b]);
}
}
};
for(unsigned i=0;i<ss.size();++i){
for(unsigned j=i+1;j<ss.size();++j){
check(ss[i],ss[j]);
}
}
}
signed main(){
// freopen("holiday.in","r",stdin);
// freopen("holiday.out","w",stdout);
scanf("%d%d%d",&n,&m,&d);
++d;
for(int i=2;i<=n;++i){
scanf("%lld",w+i);
}
for(int i=1;i<=m;++i){
int u,v;
scanf("%d%d",&u,&v);
g[u].emplace_back(v),
g[v].emplace_back(u);
}
for(int i=1;i<=n;++i){
bfs(i);
}
init2();
init4();
printf("%lld\n",ans);
return 0;
}