#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <vector>
#include <queue>
#include <algorithm>
#include <cstring>
#include <cmath>
#define inf 0x3f3f3f3f3f3f3f3f
#define int long long
#define M 10
using namespace std;
struct bian
{
int v,nex;
}s[21000];
struct node
{
int head,val;
int dis,vis;
}p[2510];
int n,m,t,ans=0;
int len=0;
int f[2510][2510]={};
bool could[2510][2510];
int maxx[2510][M]={},dui[2510][M];
inline int rd()
{
int s=0;char x='x';
while(x<'0'||x>'9')x=getchar();
while(x>='0'&&x<='9')s=s*10+(x^48),x=getchar();
return s;
}
inline void lian(int u,int v)
{
s[++len]={v,p[u].head};p[u].head=len;
s[++len]={u,p[v].head};p[v].head=len;
}
void readd()
{
n=rd();m=rd();t=rd();
p[1].val=0;
for(int i=2;i<=n;i++)p[i].val=rd(),p[i].dis=inf;
for(int i=1,u,v;i<=m;i++)
{
u=rd();v=rd();
lian(u,v);
}
}
void bfs1()
{
int u;
p[1].dis=0;
queue<int>q;
q.push(1);
while(q.size())
{
u=q.front();q.pop();
if(p[u].dis<=t)
f[u][0]=p[u].val;
else continue;
for(int i=p[u].head,v;i;i=s[i].nex)
{
v=s[i].v;
if(p[v].dis>p[u].dis+1)
{
p[v].dis=p[u].dis+1;
q.push(v);
}
}
}
}
void bfs2(int st)
{
if(f[st][0]==0)return;
int u;
p[st].dis=0;p[st].vis=st;
queue<int>q;
q.push(st);
while(q.size())
{
u=q.front();q.pop();
if(p[u].dis<=t)
{
if(u!=st)
f[st][u]=p[u].val+f[st][0];
}
else continue;
for(int i=p[u].head,v;i;i=s[i].nex)
{
v=s[i].v;
if(p[v].vis!=st)
{
p[v].vis=st;
p[v].dis=p[u].dis+1;
q.push(v);
}
}
}
}
void bfs3(int st)
{
int u;
p[st].dis=0;p[st].vis=st;
queue<int>q;
q.push(st);
while(q.size())
{
u=q.front();q.pop();
if(p[u].dis<=t)
{
could[st][u]=true;
}
else continue;
for(int i=p[u].head,v;i;i=s[i].nex)
{
v=s[i].v;
if(p[v].vis!=st)
{
p[v].vis=st;
p[v].dis=p[u].dis+1;
q.push(v);
}
}
}
}
void getans()
{
memset(maxx,-0x3f,sizeof(maxx));
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
for(int k=0;k<M;k++)
{
if(f[i][j]>maxx[j][k])
{
for(int l=M-1;l>k;l--)maxx[j][l]=maxx[j][l-1],dui[j][l]=dui[j][l-1];
maxx[j][k]=f[i][j];dui[j][k]=i;
break;
}
}
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(i==j)continue;
if(!could[i][j])continue;
for(int k=0;k<M;k++)
{
if(dui[i][k]==j)continue;
for(int l=0;l<M;l++)
{
if(dui[j][l]==i||dui[j][l]==dui[i][k])continue;
if(dui[i][k]==0||dui[j][l]==0)continue;
ans=max(ans,maxx[i][k]+maxx[j][l]);
}
}
}
}
}
signed main()
{
readd();t++;
bfs1();
for(int i=1;i<=n;i++)
bfs2(i);
for(int i=1;i<=n;i++)p[i].vis=-1;
for(int i=1;i<=n;i++)
bfs3(i);
getans();
cout<<ans;
fclose(stdin);
fclose(stdout);
return 0;
}