RT
#include<bits/stdc++.h>
#include<queue>
using namespace std;
typedef long long ll;
const ll MAXN=2505,MAXM=2e4+5;
ll n,m,k,x,y;
ll w[MAXN];
struct edge{
ll u,v,nxt;
}e[MAXM];
ll head[MAXN],edge_num;
void add_edge(ll From,ll To){
edge_num++;
e[edge_num].u=From;
e[edge_num].v=To;
e[edge_num].nxt=head[From];
head[From]=edge_num;
return;
}
ll dis[MAXN][MAXN];
bool vis[MAXN];
queue<ll> q;
void pre_dis(ll st){
q.push(st);
dis[st][st]=0;
for(int i=1;i<=n;i++)vis[i]=0;
while(q.size()){
ll now=q.front();
vis[now]=1;
q.pop();
for(int i=head[now];i;i=e[i].nxt){
if(!vis[e[i].v]){
dis[st][e[i].v]=dis[e[i].v][st]=dis[st][now]+1;
q.push(e[i].v);
}
}
}
return;
}
ll pre[MAXN][3];
int main(){
cin>>n>>m>>k;
for(int i=2;i<=n;i++)cin>>w[i];
for(int i=1;i<=m;i++){
cin>>x>>y;
add_edge(x,y);
add_edge(y,x);
}
for(int i=1;i<=n;i++)pre_dis(i);
// for(int i=1;i<=n;i++){
// for(int j=1;j<=n;j++){
// cout<<dis[i][j]<<" ";
// }
// cout<<endl;
// }
for(int i=2;i<=n;i++){
for(int j=2;j<=n;j++){
if(i==j||dis[i][j]>k+1||dis[1][j]>k+1)continue;
if(w[j]>w[pre[i][0]])pre[i][2]=pre[i][1],pre[i][1]=pre[i][0],pre[i][0]=j;
else if(w[j]>w[pre[i][1]])pre[i][2]=pre[i][1],pre[i][1]=j;
else if(w[j]>w[pre[i][2]])pre[i][2]=j;
}
}
// for(int i=2;i<=n;i++)cout<<pre[i][0]<<" "<<pre[i][1]<<" "<<pre[i][2]<<endl;
ll ans=0;
for(int i=2;i<=n;i++){
for(int j=2;j<=n;j++){
if(dis[i][j]>k+1||i==j)continue;
for(int bb=0;bb<3;bb++){
if(pre[i][bb]==j||pre[i][bb]==0)continue;
for(int cc=0;cc<3;cc++){
if(pre[j][cc]==i||pre[i][bb]==pre[j][cc]||pre[j][cc]==0)continue;
ans=max(ans,w[i]+w[j]+w[pre[i][bb]]+w[pre[j][cc]]);
}
}
}
}
cout<<ans;
return 0;
}