#include<bits/stdc++.h>
#define F(i,j,k) for(register int i=j,E=k;i<=E;i++)
#define FG(i,v) for(register int i=0,E=v.size();i<E;i++)
#define int long long
#define pb push_back
#define N 2510
#define inf 10010
using namespace std;
int n,m,k,x,y,ans,v[N],vis[N][N],d[N][N],f[N],Max[N],cMax[N],ccMax[N],p[N],cp[N],ccp[N];
vector<int> G[N];
void disdp(int s)
{
queue<int> q;
q.push(s),vis[s][s]=1;
while(!q.empty())
{
int u=q.front();
q.pop();
if(d[s][u]>=k) continue;
FG(i,G[u])
{
int t=G[u][i];
if(vis[s][t]) continue;
vis[s][t]=1;
d[s][t]=d[s][u]+1;
q.push(t);
}
}
}
signed main()
{
cin>>n>>m>>k;
F(i,0,n) F(j,0,n) d[i][j]=inf;
F(i,2,n) cin>>v[i];
F(i,0,n) d[i][i]=-1;
F(i,1,m) cin>>x>>y,G[x].pb(y),G[y].pb(x);
F(i,1,n) disdp(i);
F(i,1,n) if(d[1][i]<=k) f[i]=v[i];
F(i,2,n) F(j,2,n)
{
if(d[i][j]>k||i==j) continue;
if(Max[j]<f[i]+v[j])
{
ccMax[j]=cMax[j];
ccp[j]=cp[j];
cMax[j]=Max[j];
cp[j]=p[j];
Max[j]=f[i]+v[j];
p[j]=i;
}
else if(cMax[j]<f[i]+v[j])
{
ccMax[j]=cMax[j];
ccp[j]=cp[j];
cMax[j]=f[i]+v[j];
cp[j]=i;
}
else if(ccMax[j]<f[i]+v[j])
{
ccMax[j]=f[i]+v[j];
ccp[j]=i;
}
}
F(i,2,n) F(j,2,n)
{
if(p[i]!=p[j]&&p[i]!=j&&p[j]!=i&&i!=j&&d[i][j]<=k)
{
ans=max(ans,Max[i]+Max[j]);
}
if(cp[i]!=p[j]&&cp[i]!=j&&p[j]!=i&&i!=j&&d[i][j]<=k)
{
ans=max(ans,cMax[i]+Max[j]);
}
if(p[i]!=cp[j]&&p[i]!=j&&cp[j]!=i&&i!=j&&d[i][j]<=k)
{
ans=max(ans,Max[i]+cMax[j]);
}
if(cp[i]!=cp[j]&&cp[i]!=j&&cp[j]!=i&&i!=j&&d[i][j]<=k)
{
ans=max(ans,cMax[i]+cMax[j]);
}
if(ccp[i]!=p[j]&&ccp[i]!=j&&p[j]!=i&&i!=j&&d[i][j]<=k)
{
ans=max(ans,ccMax[i]+Max[j]);
}
if(p[i]!=ccp[j]&&p[i]!=j&&ccp[j]!=i&&i!=j&&d[i][j]<=k)
{
ans=max(ans,Max[i]+ccMax[j]);
}
if(ccp[i]!=cp[j]&&ccp[i]!=j&&cp[j]!=i&&i!=j&&d[i][j]<=k)
{
ans=max(ans,ccMax[i]+cMax[j]);
}
if(cp[i]!=ccp[j]&&cp[i]!=j&&ccp[j]!=i&&i!=j&&d[i][j]<=k)
{
ans=max(ans,cMax[i]+ccMax[j]);
}
if(ccp[i]!=ccp[j]&&ccp[i]!=j&&ccp[j]!=i&&i!=j&&d[i][j]<=k)
{
ans=max(ans,ccMax[i]+ccMax[j]);
}
}
printf("%lld",ans);
return 0;
}