#include <bits/stdc++.h>
#define tim ((double)clock()/CLOCKS_PER_SEC)
#define ll long long
#define pc putchar
#define int long long
using namespace std;
inline int read()
{
int f=0,r=0;char c=getchar();
while(!isdigit(c)) f|=(c=='-'),c=getchar();
while(isdigit(c)) r=(r<<1)+(r<<3)+(c^'0'),c=getchar();
return f? -r:r;
}
char nnu[25];
inline void write(int x)
{
if(x==0) {pc('0');return;}
if(x<0) {pc('-');x=-x;}
int top=0;
while(x) nnu[++top]=x%10+'0',x/=10;
for(int i=top;i;i--) pc(nnu[i]);
return;
}
const int maxn=2505,maxm=100004;
int nxt[maxm],head[maxn],ver[maxm],ver_tot;
inline void addedge(int u,int v) {ver[++ver_tot]=v;nxt[ver_tot]=head[u];head[u]=ver_tot;return;}
bitset<maxn> vis[maxn];
queue<int> q;
#define pi pair<int,int>
pi w[maxn];
int n,m,dep[maxn],k,a[maxn],id[maxn];
inline void bfs(int id)
{
q.push(id);
memset(dep,0,sizeof(dep));
dep[id]=1;
while(q.size())
{
int now=q.front();q.pop();
for(int i=head[now];i;i=nxt[i])
if(!dep[ver[i]])
{
dep[ver[i]]=dep[now]+1;
vis[id][ver[i]]=(dep[ver[i]]<=k+2);
q.push(ver[i]);
}
}
}
signed main()
{
n=read();m=read();k=read();
for(int i=2;i<=n;i++) a[i]=read(),w[i]=pi{a[i],i};
sort(w+2,w+1+n);
for(int i=2;i<=n;i++) id[w[i].second]=i;
id[1]=1;
for(int i=1;i<=m;i++) {int u=read(),v=read();addedge(id[u],id[v]);addedge(id[v],id[u]);}
for(int i=1;i<=n;i++) bfs(i);
int ans=0;
for(int i=n;i>=2;i--)
{
if(vis[1][i])
for(int j=n;j>=2;j--)
{
if(vis[i][j] && j!=i)
{
for(int k=n;k>=2;k--)
{
if(vis[j][k] && k!=i && k!=j)
{
for(int l=n;l>=2;l--)
{
if(vis[k][l] && vis[l][1] && l!=i && l!=j && l!=k)
{
ans=max(ans,w[i].first+w[j].first+w[k].first+w[l].first);
}
if(tim>1.80) {write(ans);pc('\n');exit(0);}
}
}
if(tim>1.80) {write(ans);pc('\n');exit(0);}
}
}
if(tim>1.80) {write(ans);pc('\n');exit(0);}
}
if(tim>1.80) {write(ans);pc('\n');exit(0);}
}
write(ans);
pc('\n');
}