#include <bits/stdc++.h>
#define INF LONG_LONG_MAX
#define int long long
#define fi first
#define se second
#define MAXN 2510
using namespace std;
int n,m,k,v[MAXN],ans,vis[MAXN],f[MAXN][MAXN],u,vv;
bool cmp(pair<int,int> a,pair<int,int> b)
{
return a.fi>b.fi;
}
set< pair<int,int> , greater< pair<int,int> > > s[MAXN];
set< pair<int,int> , greater< pair<int,int> > >::iterator it;
vector<int> p[MAXN];
queue< pair<int,int> >Q;
void bfs(int x,int d,int a)
{
Q.push({x,d});
vis[x]=1;
while(!Q.empty())
{
int u=Q.front().fi,d=Q.front().se;
Q.pop();
f[x][u]=f[u][x]=1;
if(d>=0&&f[u][1]) s[x].insert({v[u],u});
if(s[x].size()>3) s[x].erase(*((it=s[x].end())--));
if(d==k) continue;
for(int i=0;i<p[u].size();i++)
{
int v=p[u][i];
if(vis[v]) continue;
vis[v]=1;
Q.push({v,d+1});
}
}
}
signed main()
{
ios::sync_with_stdio(0);
cin>>n>>m>>k;
for(int i=2;i<=n;i++) cin>>v[i];
for(int i=1;i<=m;i++)
{
cin>>u>>vv;
p[u].push_back(vv);
p[vv].push_back(u);
}
for(int i=1;i<=n;i++)
{
memset(vis,0,sizeof(vis));
bfs(i,-1,i);
}
for(int B=2;B<=n;B++)
for(int C=2;C<=n;C++)
{
if(B==C||!f[B][C]) continue;
int t=1;
for(auto it=s[B].begin();t<=3&&it!=s[B].end();t++,it++)
{
int t2=1;
for(auto it2=s[C].begin();t2<=3&&it2!=s[C].end();t2++,it2++)
{
int A=(*it).se;
int D=(*it2).se;
if(A!=D&&A!=B&&A!=C&&D!=B&&D!=C&&A!=1&&D!=1)
ans=max(ans,v[B]+v[C]+v[A]+v[D]);
}
}
}
cout<<ans;
return 0;
}