#include <bits/stdc++.h>
using namespace std;
long long a[2505],ans;
int n,m,k,tot,head[2505];
int bk[2505],dis[2505][2505];
vector<long long>vec[2505];
struct Edge
{
int next,to;
}e[20005];
void add_edge(int u,int v)
{
e[++tot].next=head[u];
e[tot].to=v;
head[u]=tot;
}
bool cmp(int x,int y)
{
return a[x]>a[y];
}
void bfs(int st)
{
queue<int>q;
memset(bk,0,sizeof bk);
q.push(st);
bk[st]=1;
dis[st][st]=0;
while(!q.empty())
{
int u=q.front();
q.pop();
if(dis[1][u]<=k&&dis[st][u]<=k&&u!=st&&u!=1)
{
vec[st].emplace_back(u);
sort(vec[st].begin(),vec[st].end(),cmp);
if(vec[st].size()>3)
vec[st].pop_back();
}
for(int i=head[u];i;i=e[i].next)
{
int v=e[i].to;
if(bk[v])
continue;
dis[st][v]=dis[v][st]=dis[st][u]+1;
q.push(v);
bk[v]=1;
}
}
}
int main()
{
scanf("%d%d%d",&n,&m,&k);
k++;
for(int i=2;i<=n;i++)
{
scanf("%lld",&a[i]);
}
for(int i=1;i<=m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
add_edge(x,y);
add_edge(y,x);
}
for(int i=1;i<=n;i++)
{
bfs(i);
}
for(int i=2;i<=n;i++)
{
for(int j=i+1;j<=n;j++)
{
if(dis[i][j]>k)
continue;
for(auto p:vec[i])
{
for(auto q:vec[j])
{
if(p!=q&&j!=p&&i!=q)
ans=max(ans,a[i]+a[j]+a[p]+a[q]);
}
}
}
}
printf("%lld",ans);
}