#include<cstdio>
#include<algorithm>
#include<list>
#include<memory.h>
using namespace std;
const int N=2510,M=20010;
#define ll long long
int n,m,k;
ll INF,ans;
ll dist[N][N],v[N];
int head[N],nxt[M],to[M],cnt;
inline void add(int u,int v){
nxt[++cnt]=head[u];
to[cnt]=v;
head[u]=cnt;
}
struct Node{
int dis,pos;
};
void bfs(){
memset(dist,127,sizeof(dist));
list<Node>q;
Node tmp;
for(int i=1;i<=n;i++){
q.clear();
q.push_back({0,i});
while(!q.empty()){
tmp=q.front();
q.pop_front();
if(dist[i][tmp.pos]!=INF||tmp.dis>k+1)
continue;
dist[i][tmp.pos]=tmp.dis;
for(int tp=head[tmp.pos];tp;tp=nxt[tp])
q.push_back({tmp.dis+1,to[tp]});
}
}
}
int main(){
memset(&INF,127,sizeof(INF));
memset(&ans,-127,sizeof(ans));
scanf("%d%d%d",&n,&m,&k);
for(int i=2;i<=n;i++)
scanf("%lld",v+i);
for(int i=1,u,v;i<=m;i++)
scanf("%d%d",&u,&v),
add(u,v),add(v,u);
bfs();
for(int i=2;i<=n;i++)
for(int j=i+1;j<=n;j++)
for(int k=j+1;k<=n;k++)
for(int r=k+1;r<=n;r++){
if(dist[i][1]!=INF&&dist[r][1]!=INF&&dist[i][j]!=INF&&dist[j][k]!=INF&&dist[k][r]!=INF)
ans=max(ans,v[i]+v[j]+v[k]+v[r]);
}
printf("%lld\n",ans);
return 0;
}