#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
#include<ctime>
#include<random>
#include<cstdlib>
#define int long long
using namespace std;
const int maxn=2510;
const int maxm=1e7;
int head[maxn],cnt=1,n,m,k,dp[maxn],dis[maxn][maxn],c[maxn],a[maxn],ans;
bool vis[maxn];
queue<int>q;
struct node{
int to,nxt;
}e[maxm],ee[maxm];
void add(int u,int v,int op){
if(op==1) e[cnt].to=v,e[cnt].nxt=head[u],head[u]=cnt++;
else ee[cnt].to=v,ee[cnt].nxt=head[u],head[u]=cnt++;
}
int dfs(int u,int d){
if(d==4)
return dp[u]=(dis[1][u]<=k+1)?a[u]:-5e18;
if(~dp[u]) return dp[u];
int ret=-5e18;
for(int i=head[u];i;i=ee[i].nxt){
int v=ee[i].to;
if(c[v]==d+1) ret=max(ret,dfs(v,d+1)+a[u]);
}
return dp[u]=ret;
}
void bfs(int s){
memset(vis,0,sizeof(vis));
dis[s][s]=0;
q.push(s),vis[s]=1;
while(!q.empty()){
int u=q.front();
q.pop();
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].to;
if(!vis[v])
dis[s][v]=dis[s][u]+1,vis[v]=1,q.push(v);
}
}
}
signed main(){
mt19937 myrd(time(0));
scanf("%lld%lld%lld",&n,&m,&k);
for(int i=2;i<=n;i++) scanf("%lld",&a[i]);
for(int i=1;i<=m;i++){
int u,v;scanf("%lld%lld",&u,&v);
add(u,v,1),add(v,u,1);
}
memset(dis,0x3f,sizeof(dis));
for(int i=1;i<=n;i++) bfs(i);
memset(head,0,sizeof(head));
cnt=1;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(dis[i][j]<=k+1&&i!=j) add(i,j,2);
while((double)clock()/CLOCKS_PER_SEC<=1.90){
memset(dp,-1,sizeof(dp));
for(int i=2;i<=n;i++) c[i]=myrd()%4+1;
dfs(1,0);
ans=max(ans,dp[1]);
}
printf("%lld",ans);
return 0;
}