#include <iostream>
#include <cstdio>
#include <vector>
#include <cmath>
#include <cstring>
#include <queue>
#include <algorithm>
#define N 2505
using namespace std;
int n,m,k,siz[N];
bool vis[N][N],e[N];
long long val[N];
vector<int> mp[N];
struct node{
long long val;
int num;
bool operator <(const node &b)const{
return val>b.val;
}
}zui[N][3],lin[N];
queue<node> l;
int main() {
scanf("%d%d%d",&n,&m,&k);
for(int i=2;i<=n;++i){
scanf("%lld",&val[i]);
}
while(m--){
int u,v;
scanf("%d%d",&u,&v);
mp[u].push_back(v);
mp[v].push_back(u);
}
for(int i=1;i<=n;++i){
memset(e,0,sizeof(e));
l.push((node){
i,0
});
while(!l.empty()){
node p=l.front();
vis[i][p.val]=1;
l.pop();
if(p.num>k||e[p.val])
continue;
e[p.val]=1;
for(int i=0;i<mp[p.val].size();++i){
l.push((node){
mp[p.val][i],p.num+1
});
}
}
vis[i][i]=0;
}
for(int j=1;j<=n;++j){
int last=0;
for(int i=1;i<=n;++i){
if(vis[1][i]&&vis[i][j]){
lin[++last]=(node){
val[i],i
};
}
}
siz[j]=min(3,last);
if(siz[j]>0){
nth_element(lin+1,lin+2,lin+last+1);
zui[j][0]=lin[1];}
if(siz[j]>1){
nth_element(lin+1,lin+3,lin+last+1);
zui[j][1]=lin[2];}
if(siz[j]>2){
nth_element(lin+1,lin+4,lin+last+1);
zui[j][2]=lin[3];}
}
long long maxn=0;
for(int i=1;i<=n;++i){
for(int j=1;j<=n;++j){
if(i==j||(!vis[i][j]))continue;
for(int k1=0;k1<siz[i];++k1){
for(int k2=0;k2<siz[j];++k2){
int p1=zui[i][k1].num,p2=zui[j][k2].num;
if(p1!=j&&p1!=p2&&p2!=i){
maxn=max(maxn,val[i]+val[j]+val[p1]+val[p2]);
}
}
}
}
}
printf("%lld",maxn);
return 0;
}