#include<bits/stdc++.h>
using namespace std;
int n,m,k;
long long score[2501];
vector<pair<long long,int> >way[2501];
vector<pair<int,int> >ori[2501];
int dist[2501][2501],ne[2501][2501];
bool vis[2501];
priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > >que;
void dij(int x,int s)
{
dist[s][x]=0;
que.push(make_pair(0,x));
while(que.size())
{
int tmp=que.top().second;
que.pop();
if(vis[tmp])
continue;
vis[tmp]=1;
for(int i=0;i<ori[tmp].size();i++)
{
int to=ori[tmp][i].second;
dist[s][to]=min(dist[s][to],dist[s][tmp]+ori[tmp][i].first);
if(!vis[to])
que.push(make_pair(dist[s][to],to));
}
}
}
int main()
{
scanf("%d%d%d",&n,&m,&k);
for(int i=2;i<=n;i++)
scanf("%lld",&score[i]);
for(int i=1;i<=m;i++)
{
int from,to;
scanf("%d%d",&from,&to);
ori[from].push_back(make_pair(1,to));
ori[to].push_back(make_pair(1,from));
}
for(int i=0;i<=2500;i++)
for(int j=0;j<=2500;j++)
dist[i][j]=INT_MAX;
for(int i=1;i<=n;i++)
{
for(int j=0;j<=2500;j++)
vis[j]=0;
dij(i,i);
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
dist[i][j]--;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(dist[i][j]<=k&&i!=j)
ne[i][j]=1;
for(int i=2;i<=n;i++)
{
priority_queue<pair<int,long long>,vector<pair<int,long long> >,less<pair<int,long long> > >q;
for(int j=2;j<=n;j++)
if(i!=j&&ne[i][j]==1&&ne[1][i]==1)
q.push(make_pair(score[i]+score[j],j));
while(way[i].size()<3&&q.size())
{
way[i].push_back(q.top());
q.pop();
}
}
long long maxn=0;
for(int i=2;i<=n;i++)
{
for(int j=2;j<=n;j++)
{
if(i!=j)
{
for(int p=0;p<way[i].size();p++)
{
for(int q=0;q<way[j].size();q++)
{
if(way[i][p].second!=way[j][q].second&&i!=way[j][q].second&&j!=way[i][p].second&&ne[way[i][p].second][way[j][q].second]==1)
{
maxn=max(maxn,way[i][p].first+way[j][q].first);
}
}
}
}
}
}
printf("%lld",maxn);
return 0;
}
记录