#include<bits/stdc++.h>
using namespace std;
int n,m,k,i,j,l,x,y,e[2510][2510],tot,head[2510],tots[2510],a[2510],ma,inf;
struct Node{int sum,id;}p[2510][2510];
struct Edge{int to,nex;}edge[40010];
void ins(int x,int y){edge[tot].to=y;edge[tot].nex=head[x];head[x]=tot++;}
Node make(int x,int y){Node node;node.sum=x;node.id=y;return node;}
void sc(int x){
int i;
queue<int> p;
p.push(x);
while (!p.empty()){
int fs=p.front();p.pop();
for (int i=head[fs];~i;i=edge[i].nex){
int v=edge[i].to;
if (e[x][v]>e[x][fs]+1) e[x][v]=e[v][x]=e[x][fs]+1,p.push(v);
}
}
}
bool cmp(Node x,Node y){return x.sum>y.sum;}
int main(){
scanf("%d%d%d",&n,&m,&k);k++;
for (i=2;i<=n;i++) scanf("%d",&a[i]);
memset(head,-1,sizeof(head));memset(e,0x3f3f3f3f,sizeof(e));
for (i=1;i<=m;i++) scanf("%d%d",&x,&y),ins(x,y),ins(y,x);
for (i=1;i<=n;i++) e[i][i]=0,sc(i);
for (i=2;i<=n;i++)
for (j=2;j<=n;j++)
if (i!=j)
if (e[1][j]<=k&&e[j][i]<=k)
if (tots[i]<3) p[i][++tots[i]]=make(a[j]+a[i],j);
else if (p[i][1].sum<p[i][2].sum&&p[i][1].sum<p[i][3].sum&&p[i][1].sum<a[j]+a[i]) p[i][1]=make(a[j]+a[i],j);
else if (p[i][2].sum<p[i][1].sum&&p[i][2].sum<p[i][3].sum&&p[i][2].sum<a[j]+a[i]) p[i][2]=make(a[j]+a[i],j);
else if (p[i][3].sum<p[i][1].sum&&p[i][3].sum<p[i][2].sum&&p[i][3].sum<a[j]+a[i]) p[i][3]=make(a[j]+a[i],j);
for (i=2;i<=n;i++)
for (j=2;j<=n;j++)
if (i!=j&&tots[i]!=0&&tots[j]!=0&&e[i][j]<=k)
for (k=1;k<=tots[i];k++)
for (l=1;l<=tots[j];l++)
if (p[j][l].id!=i&&p[j][l].id!=p[i][k].id&&p[i][k].id!=j)
ma=max(ma,p[j][l].sum+p[i][k].sum);
printf("%d\n",ma);
return 0;
}