#include<bits/stdc++.h>
#define int long long
using namespace std;
inline void read(int &x){
x=0;
int y=1;
char a;
a=getchar();
while(a>'9'||a<'0'){
if(a=='-')y=-1;
a=getchar();
}
while(a>='0'&&a<='9'){
x=x*10+a-'0';
a=getchar();
}
x*=y;
}
int n,m,k;
int w[4888],fz[4888][6];
vector<int>f[4888];
vector<int>ft[4888];
int fans;
int fd[4888],d[4888],qfz[4888];
int l,r;
void bfs(int x){
for(int i=1;i<=n;++i)d[i]=0x7f7f7f7f;
for(int i=1;i<=n;++i)qfz[i]=0;
l=r=1,fd[l]=x,d[x]=-1,qfz[x]=1;
while(l<=r){
int y=fd[l];++l;
for(int i=0;i<f[y].size();++i){
int z=f[y][i];
if(qfz[z])continue;
++r;
fd[r]=z,d[z]=d[y]+1;
qfz[z]=1;
}
}
for(int i=1;i<=n;++i){
if(i==x)continue;
if(d[i]>k)continue;
ft[x].push_back(i);
}
}
void findans(int x,int y){
int xz=1,yz=1;
if(fz[x][xz]==y)xz+=2;
if(fz[y][yz]==x)yz+=2;
if(fz[x][xz]!=fz[y][yz]){
fans=max(fans,fz[x][xz-1]+fz[y][yz-1]+w[x]+w[y]);
return;
}
if(fz[x][xz+2]!=y)fans=max(fans,fz[x][xz+1]+fz[y][yz-1]+w[x]+w[y]);
if(fz[y][yz+2]!=x)fans=max(fans,fz[x][xz-1]+fz[y][yz+1]+w[x]+w[y]);
}
signed main(){
read(n);read(m);read(k);
for(int i=2;i<=n;++i)read(w[i]);
for(int i=1;i<=m;++i){
int a,b;
read(a);read(b);
f[a].push_back(b);
f[b].push_back(a);
}
for(int i=1;i<=n;++i)bfs(i);
for(int i=0;i<ft[1].size();++i){
int x=ft[1][i];
for(int j=0;j<ft[x].size();++j){
int y=ft[x][j];
if(w[x]>=fz[y][0]){
fz[y][4]=fz[y][2],fz[y][5]=fz[y][3];
fz[y][2]=fz[y][0],fz[y][3]=fz[y][1];
fz[y][0]=w[x],fz[y][1]=x;
}
else{
if(w[x]>=fz[y][2]){
fz[y][4]=fz[y][2],fz[y][5]=fz[y][3];
fz[y][2]=w[x],fz[y][3]=x;
}
else{
if(w[x]>=fz[y][4]){
fz[y][4]=w[x],fz[y][5]=x;
}
}
}
}
}
fans=-1e9;
for(int i=2;i<=n;++i){
if(fz[i][1]==0)continue;
for(int j=0;j<ft[i].size();++j){
int x=ft[i][j];
if(fz[x][1]==0)continue;
findans(i,x);
}
}
cout<<fans<<endl;
return 0;
}
求助,救救孩子吧,调了一个下午加一个晚上了