#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ull;
const int N=2500;
int n,m,k;
vector<int> adj[N+5];
bool vis[N+5][N+5]={0};
ull v[N+5];
ull vd[N+5]={0};
int vdx[N+5]={0};
ull vd2[N+5]={0};
int vdx2[N+5]={0};
ull cm=0;
void bfs(int s,int f,int t)
{
queue<int> q;
if(t>k) return;
for(int i=0;i<adj[s].size();++i)
{
if(!vis[f][adj[s][i]])
{
vis[f][adj[s][i]]=1;
q.push(adj[s][i]);
}
}
while(!q.empty())
{
bfs(q.front(),f,t+1);
q.pop();
}
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cin>>n>>m>>k;
for(int i=2;i<=n;++i)
{
cin>>v[i];
}
v[1]=0;
for(int i=1;i<=m;++i)
{
int x,y;
cin>>x>>y;
adj[x].push_back(y);
adj[y].push_back(x);
}
for(int i=1;i<=n;++i)
{
vis[i][i]=1;
bfs(i,i,0);
}
for(int i=1;i<=n;++i)
{
vis[i][i]=0;
}
for(int i=2;i<=n;++i)
{
if(!vis[1][i]) continue;
for(int j=2;j<=n;++j)
{
if(!vis[i][j]) continue;
if(v[i]+v[j]>vd[j])
{
vd2[j]=vd[j];
vdx2[j]=vdx[j];
vd[j]=v[i]+v[j];
vdx[j]=i;
}
else if(v[i]+v[j]>vd2[j])
{
vd2[j]=v[i]+v[j];
vdx2[j]=i;
}
}
}
for(int i=2;i<=n;++i)
{
for(int j=2;j<=n;++j)
{
if(!vis[i][j]) continue;
if(vdx[i]!=vdx[j] && i!=vdx[j] && j!=vdx[i])
{
if(vd[i]+vd[j]>cm)
{
cm=vd[i]+vd[j];
}
}
else
{
if(vdx2[i]!=0 && vdx2[j]!=0 && vdx2[i]!=vdx[j] && i!=vdx[j] && j!=vdx2[i] && vdx[i]!=vdx2[j] && i!=vdx2[j] && j!=vdx[i])
{
if(max(vd2[i]+vd[j],vd[i]+vd2[j])>cm)
{
cm=max(vd2[i]+vd[j],vd[i]+vd2[j]);
}
}
else if(vdx2[i]!=0 && vdx2[i]!=vdx[j] && i!=vdx[j] && j!=vdx2[i])
{
if(vd2[i]+vd[j]>cm)
{
cm=vd2[i]+vd[j];
}
}
else if(vdx2[j]!=0 && vdx[i]!=vdx2[j] && i!=vdx2[j] && j!=vdx[i])
{
if(vd[i]+vd2[j]>cm)
{
cm=vd[i]+vd2[j];
}
}
}
}
}
cout<<cm<<'\n';
return 0;
}
https://www.luogu.com.cn/record/93335968