#include<bits/stdc++.h>
using namespace std;
#define PII pair<int,int>
#define int long long
const int N=3005,M=20005;
int n,m,k;
int to[M],nxt[M],h[N],tot;
int v[N],dis[N][N],V[N][10];
PII pre[N][10];
vector<int> ver[N];
int VAL[N][10],val[N],maxx;
void add(int x,int y)
{
to[++tot]=y;
nxt[tot]=h[x];
h[x]=tot;
}
void BFS(int X)
{
queue<int> q;
memset(v,0,sizeof v);
bool flag=false;
q.push(X);
v[X]=1;
dis[X][X]=0;
while(q.size())
{
if(flag)break;
int x=q.front();
q.pop();
for(int i=h[x];i;i=nxt[i])
{
int y=to[i];
if(v[y])continue;
v[y]=1;
dis[X][y]=dis[X][x]+1;
if(dis[X][y]>k+1)
{
flag=true;
break;
}
ver[X].push_back(y);
q.push(y);
}
}
}
bool judge(int P,int x,int y)
{
if(x==P)return false;
if(x==1)return true;
if(judge(P,pre[x][y].first,pre[x][y].second))return true;
else return false;
}
void spfa()
{
queue<PII> q;
q.push({1,0});
VAL[1][0]=0;
V[1][0]=1;
while(q.size())
{
PII x=q.front();q.pop();
V[x.first][x.second]=0;
if(x.second==4&&dis[1][x.first]<=k+1)maxx=max(maxx,VAL[x.first][x.second]);
if(x.second==4)continue;
for(int i=0;i<ver[x.first].size();i++)
{
int y=ver[x.first][i];
if(!judge(y,x.first,x.second))continue;
if(VAL[y][x.second+1]<VAL[x.first][x.second]+val[y])
{
pre[y][x.second+1]={x.first,x.second};
VAL[y][x.second+1]=VAL[x.first][x.second]+val[y];
if(!V[y][x.second+1])q.push({y,x.second+1}),V[y][x.second+1]=1;
}
}
}
}
signed main()
{
scanf("%lld%lld%lld",&n,&m,&k);
for(int i=2;i<=n;i++)scanf("%lld",&val[i]);
for(int i=1;i<=m;i++)
{
int x,y;
scanf("%lld%lld",&x,&y);
add(x,y);
add(y,x);
}
memset(dis,0x3f,sizeof dis);
for(int i=1;i<=n;i++)BFS(i);
spfa();
cout<<maxx;
return 0;
}