#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,m,k,score[2505],x,y,ans;
vector<ll>v[2505],v2[2505];
bitset<2505> ok[2505];
bitset<2505> vis;
set<pair<ll,ll> >s[2505];
struct node
{
ll x,d;
node(ll a,ll b)
{
x=a,d=b;
}
};
void bfs(ll x)
{
queue<node>q=queue<node>();
vis.reset();
q.push(node(x,0));
while(!q.empty())
{
node tmp=q.front();
q.pop();
vis[tmp.x]=1;
if(tmp.d-1<=k)
ok[x][tmp.x]=1;
else break;
for(int i=0;i<v[tmp.x].size();i++)
if(!vis[v[tmp.x][i]])q.push(node(v[tmp.x][i],tmp.d+1));
}
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n>>m>>k;
for(int i=2;i<=n;i++)
cin>>score[i];
for(int i=1;i<=m;i++)
cin>>x>>y,v[x].push_back(y),v[y].push_back(x);
for(ll i=1;i<=n;i++)
{
bfs(i);
ok[i][i]=0;
}
for(int i=2;i<=n;i++)
{
for(int j=2;j<=n;j++)
{
if(j==i)continue;
if(ok[i][j]&&ok[1][j])s[i].insert(make_pair(score[j],j));
if(s[i].size()>3)s[i].erase(s[i].begin());
}
}
for(int b=2;b<=n;b++)
for(int c=b+1;c<=n;c++)
{
if((!ok[b][c]))continue;
for(auto a=s[b].begin();a!=s[b].end();a++)
{
if((*a).second==b||(*a).second==c)continue;
for(auto d=s[c].begin();d!=s[c].end();d++)
{
if((*d).second==b||(*d).second==c||(*d).second==(*a).second)continue;
ans=max(ans,score[b]+score[c]+score[(*a).second]+score[(*d).second]);
}
}
}
cout<<ans;
}