#include<bits/stdc++.h>
using namespace std;
#define int long long
const int inf=4e18;
inline int read()
{
char ch=getchar();int x=0,r=1;
while(ch<'0'||ch>'9'){if(ch=='-')r=0;ch=getchar();}
while(ch>='0'&&ch<='9')x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
return r?x:-x;
}
int n,m,k,dis[2510],u,x,y;
vector<int> e[2510],can[2510];
int anss,a[2510],ans[2510][8];
queue<int> q;
void bfs(int xx)
{
for(int i=1;i<=n;++i)dis[i]=inf;
dis[xx]=0;q.push(xx);
while(!q.empty())
{
u=q.front();q.pop();
if(u!=xx)can[xx].push_back(u);
if(dis[u]==k+1)continue;
for(int v:e[u])if(dis[v]==inf)dis[v]=dis[u]+1,q.push(v);
}
}
signed main()
{
n=read();m=read();k=read();
for(int i=2;i<=n;++i)a[i]=read();
while(m--)
{
x=read();y=read();
e[x].push_back(y);e[y].push_back(x);
}
for(int i=1;i<=n;++i)bfs(i);
for(int i=2;i<=n;++i)for(int j=0;j<=3;++j)ans[i][j]=-inf;
for(int i:can[1])
{
for(int j:can[i])
{
if(j==1)continue;
for(int o=0;o<=6;o+=2)
if(a[i]+a[j]>ans[j][o])
{
for(int p=o+2;p<=6;p+=2)ans[j][p]=ans[j][p-2],ans[j][p+1]=ans[j][p-1];
ans[j][o]=a[i]+a[j];ans[j][o+1]=i;
break;
}
}
}
for(int i=2;i<=n;++i)
for(int j:can[i])
{
if(j<i)continue;
for(int o=0;o<=6;o+=2)
{
if(ans[i][o+1]==j||ans[i][o]==-inf)continue;
for(int p=0;p<=6;p+=2)
if(ans[j][p+1]!=i&&ans[i][o+1]!=ans[j][p+1]&&ans[j][p]!=-inf)anss=max(anss,ans[i][o]+ans[j][p]);
}
}
printf("%lld\n",anss);
return 0;
}