#include<bits/stdc++.h>
using namespace std;
int h[100001],nxt[500001],val[500001],zd[500001],cnt=0;
int n,m,s,k;
long long dis[100001];
bool inq[100001];
int q[1000001],f,e;
long long pval[100001],pval2[100005],ans=0;
int vis[5]={};
bool ed[10001][10001];
int zhuan[10001][10001];
vector<int>ljb[10001];
void addedge(int a,int b,int c){
cnt++;
val[cnt]=c,zd[cnt]=b,nxt[cnt]=0;
nxt[cnt]=h[a];
h[a]=cnt;
}
void dfs(int i,int dep,long long valu,int vis[5]){
register int summmm=0;
for(register int qwq=1;qwq<=4-dep;qwq++)summmm+=pval2[qwq];
if(summmm+valu<ans)return;
for(register int qaq=0;qaq<4;qaq++)if(i==vis[qaq])return;
vis[dep]=i;
if(dep==4){
for(register int p=0;p<ljb[i].size();p++)
if(ljb[i][p]==1){
ans=max(ans,valu);
}
return;
}
for(register int p=0;p<ljb[i].size();p++){
dfs(ljb[i][p],dep+1,valu+pval[ljb[i][p]],vis);
}
}
bool cmp(int a,int b){
return a>b;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
memset(zhuan,-1,sizeof(zhuan));
cin>>n>>m>>k;
for(register int i=2;i<=n;i++){
cin>>pval[i];
pval2[i]=pval[i];
}
for(register int i=1;i<=m;i++){
register int a,b;
cin>>a>>b;
addedge(a,b,1);
addedge(b,a,1);
ed[a][b]=1;
ed[b][a]=1;
zhuan[a][b]=0;
zhuan[b][a]=0;
}
if(k==0&&n<=20){
unsigned long long res=0;
for(register int a=2;a<=n;a++){
for(register int b=2;b<=n;b++){
if(b==a)continue;
for(register int c=2;c<=n;c++){
if(c==a||c==b)continue;
for(register int d=2;d<=n;d++){
if(d==a||d==b||d==c)continue;
if(ed[1][a]==1){
if(ed[a][b]==1){
if(ed[b][c]==1){
if(ed[c][d]==1){
if(ed[d][1]==1){
if(pval[a]+pval[b]+pval[c]+pval[d]>res)res=pval[a]+pval[b]+pval[c]+pval[d];
}
}
}
}
}
}
}
}
}
cout<<res;
}else if(n>20){
for(register int s=1;s<=n;s++){
memset(dis,-1,sizeof(dis));
memset(inq,0,sizeof(inq));
dis[s]=0,inq[s]=1;
q[1]=s,f=1,e=1;
while(f<=e){
register int u=q[f++];
for(register int p=h[u];p;p=nxt[p]){
register long long v=zd[p],c=val[p];
if(dis[v]==-1||dis[v]>dis[u]+c){
dis[v]=dis[u]+c;
if(inq[v]==0)q[++e]=v,inq[v]=1;
}
}
}
for(register int i=1;i<=n;i++){
if(i==s||dis[i]>k+1||dis[i]==-1)continue;
ljb[s].push_back(i);
}
}
sort(pval2+1,pval2+n+1,cmp);
dfs(1,0,0,vis);
cout<<ans;
}else{
for(register int a=1;a<=n;a++){
for(register int b=1;b<=n;b++){
if(b==a)continue;
for(register int c=1;c<=n;c++){
if(c==a||c==b)continue;
if(ed[a][b]&&ed[b][c]){
ed[a][c]=1;
if(zhuan[a][c]==-1||zhuan[a][b]+zhuan[b][c]+1<zhuan[a][c])zhuan[a][c]=zhuan[a][b]+zhuan[b][c]+1;
}
}
}
}
unsigned long long res=0;
for(register int a=2;a<=n;a++){
for(register int b=2;b<=n;b++){
if(b==a)continue;
for(register int c=2;c<=n;c++){
if(c==a||c==b)continue;
for(register int d=2;d<=n;d++){
if(d==a||d==b||d==c)continue;
if(ed[1][a]==1){
if(ed[a][b]==1){
if(ed[b][c]==1){
if(ed[c][d]==1){
if(ed[d][1]==1){
if(zhuan[1][a]>k||zhuan[a][b]>k||zhuan[b][c]>k||zhuan[c][d]>k||zhuan[d][1]>k)continue;
if(pval[a]+pval[b]+pval[c]+pval[d]>res){
res=pval[a]+pval[b]+pval[c]+pval[d];
//cout<<a<<" "<<b<<" "<<c<<" "<<d<<" "<<res<<"\n";
}
}
}
}
}
}
}
}
}
}
cout<<res;
}
}
虽然是暴力,但是感觉有过官方数据的可能?