#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int MAXN=2505,MAXM=10005;
int n,m,k;
int u,v;
ll p[MAXN];
int tot,head[MAXN],to[MAXM<<1],nxt[MAXM<<1];
void link(int u,int v)
{
to[++tot]=v;
nxt[tot]=head[u];
head[u]=tot;
}
int dis[MAXN],flag[MAXN];
int q[MAXN],l,r;
int m1[MAXN],m2[MAXN],m3[MAXN];
int ok[MAXN][MAXN];
void bfs(int st)
{
for(int i=1;i<=n;i++)
dis[i]=k+1,flag[i]=0;
dis[st]=0; flag[st]=1;
l=r=1; q[r]=st;
while(l<=r)
{
int tmp=q[l++];
if(dis[tmp]==k) continue;
for(int i=head[tmp];i;i=nxt[i])
{
int it=to[i];
if(!flag[it])
{
flag[it]=1;
dis[it]=dis[tmp]+1;
q[++r]=it;
}
}
}
for(int i=1;i<=n;i++)
if(dis[i]<=k)
{
ok[st][i]=1;
if(i==1 || i==st) continue;
if(p[i]>p[m1[st]])
{
m3[st]=m2[st]; m2[st]=m1[st];
m1[st]=i;
}
else if(p[i]>p[m2[st]])
m3[st]=m2[st],m2[st]=i;
else if(p[i]>p[m3[st]]) m3[st]=i;
}
}
ll ans;
void chk(int x,int y,int z,int w)
{
if(!x || !w || x==z || x==w || y==w || !ok[w][1] || !ok[x][1]) return ;
ans=max(ans,p[x]+p[y]+p[z]+p[w]);
}
int main()
{
scanf("%d%d%d",&n,&m,&k);
++k;
for(int i=2;i<=n;i++)
scanf("%lld",&p[i]);
for(int i=1;i<=m;i++)
{
scanf("%d%d",&u,&v);
link(u,v); link(v,u);
}
for(int i=2;i<=n;i++)
bfs(i);
for(int i=2;i<n;i++)
for(int j=i+1;j<=n;j++)
if(ok[i][j])
{
chk(m1[i],i,j,m1[j]);
chk(m1[i],i,j,m2[j]);
chk(m1[i],i,j,m3[j]);
chk(m2[i],i,j,m1[j]);
chk(m2[i],i,j,m2[j]);
chk(m2[i],i,j,m3[j]);
chk(m3[i],i,j,m1[j]);
chk(m3[i],i,j,m2[j]);
chk(m3[i],i,j,m3[j]);
}
printf("%lld",ans);
return 0;
}