#include<bits/stdc++.h>
using namespace std;
int i,j,k,n,m,l,dis[2510],head[2510],a[2510],x,y,tot;
struct Edge{int to,nex;}edge[5000100];
struct Node{long long sum;int id;}ma[2510][5];
queue<int> p;
long long ans;
bool in[2510][2510],vis[2510];
Node make(long long _sum,int _id){Node h;h.sum=_sum;h.id=_id;return h;}
void ins(int x,int y){edge[tot].nex=head[x];edge[tot].to=y;head[x]=tot++;}
void sc(int x){
memset(dis,0x3f,sizeof(dis));
memset(vis,0,sizeof(vis));
p.push(x);dis[x]=0;
while (!p.empty()){
int h=p.front();p.pop();
if (vis[h]) continue;
vis[h]=1;
for (int i=head[h];~i;i=edge[i].nex){
int u=edge[i].to;
if (!vis[u]&&dis[u]>dis[h]+1&&dis[h]<=k)
dis[u]=dis[h]+1,p.push(u),in[x][u]=in[u][x]=true;
}
}
}
int main(){
scanf("%d%d%d",&n,&m,&k);
memset(head,-1,sizeof(head));
for (i=2;i<=n;i++) scanf("%d",&a[i]);
for (i=1;i<=m;i++) scanf("%d%d",&x,&y),ins(x,y),ins(y,x);
for (i=1;i<=n;i++) sc(i);
for (i=1;i<=n;i++) ma[i][1].id=ma[i][2].id=ma[i][3].id=-1;
for (i=2;i<=n;i++)
for (j=2;j<=n;j++)
if (i!=j&&in[1][i]&&in[i][j]){
long long sum=a[i]+a[j];
if (sum>ma[j][1].sum) ma[j][3]=ma[j][2],ma[j][2]=ma[j][1],ma[j][1]=make(sum,i);
else if (sum>ma[j][2].sum) ma[j][3]=ma[j][2],ma[j][2]=make(sum,i);
else if (sum>ma[j][3].sum) ma[j][3]=make(sum,i);
}
for (i=2;i<=n;i++)
for (j=2;j<=n;j++)
if (in[i][j])
for (k=1;k<=3;k++)
for (l=1;l<=3;l++)
if (ma[i][k].id!=-1&&ma[j][l].id!=-1&&ma[i][k].id!=ma[j][l].id&&ma[i][k].id!=j&&ma[j][l].id!=i)
ans=max(ans,ma[j][l].sum+ma[i][k].sum);
printf("%lld\n",ans);
return 0;
}