#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,k;
int a[25001];
struct egde{
int to;
int nxt;
}e[100001];
int head[100001],cnt;
void add(int x,int y){
e[++cnt].to=y;
e[cnt].nxt=head[x];
head[x]=cnt;
}
int dis[3001][3001];
priority_queue<pair<int,int> > p[3001];
void dij(int x){
dis[x][x]=0;
priority_queue<pair<int,int> > q;
q.push(make_pair(0,x));
while(q.size()){
int now=q.top().second;
q.pop();
for(int i=head[now];i;i=e[i].nxt){
int y=e[i].to;
if(dis[x][y]>dis[x][now]+1){
dis[x][y]=dis[x][now]+1;
q.push(make_pair(-dis[x][y],y));
}
}
}
for(int i=2;i<=n;i++){
if(i==x)continue;
if(dis[x][i]<=k)p[x].push(make_pair(a[i],i));
}
}
int ans;
signed main(){
memset(dis,0x7f,sizeof(dis));
scanf("%lld%lld%lld",&n,&m,&k);
k++;
for(int i=2;i<=n;i++){
scanf("%lld",&a[i]);
}
for(int i=1;i<=m;i++){
int x,y;
scanf("%lld%lld",&x,&y);
add(x,y),add(y,x);
}
for(int i=1;i<=n;i++){
dij(i);
}
for(int i=2;i<=n;i++){
int ta[4],tb[4],tat=3,tbt=3;
priority_queue<pair<int,int> > tmpq;
for(int t=1;t<=tat;t++){
if(!p[i].size()){
tat=t-1;
break;
}
if(dis[1][p[i].top().second]>k){
t--;
tmpq.push(p[i].top());
p[i].pop();
continue;
}
tmpq.push(p[i].top());
ta[t]=p[i].top().second;
p[i].pop();
}
while(tmpq.size()){
p[i].push(tmpq.top());
tmpq.pop();
}
for(int j=2;j<=n;j++){
if(i==j||dis[i][j]>k)continue;
for(int t=1;t<=tbt;t++){
if(!p[j].size()){
tbt=t-1;
break;
}
if(dis[1][p[j].top().second]>k){
t--;
tmpq.push(p[j].top());
p[j].pop();
continue;
}
tmpq.push(p[j].top());
tb[t]=p[j].top().second;
p[j].pop();
}
while(tmpq.size()){
p[j].push(tmpq.top());
tmpq.pop();
}
for(int ti=1;ti<=tat;ti++){
for(int tj=1;tj<=tbt;tj++){
int u=ta[ti],v=tb[tj];
if(u==v||u==i||u==j)continue;
if(v==i||v==j)continue;
ans=max(ans,a[i]+a[j]+a[u]+a[v]);
}
}
}
}
printf("%lld",ans);
return 0;
}