#include<bits/stdc++.h>
using namespace std;
const int N=3e3;
#define ll long long
struct node{
ll id,fs;
}ma[N][N],md[N][N];
ll n,m,k,x,y,cnt[N],ans=-1,sum;
ll dis[N][N],vis[N],fs[N];
vector<ll>v[N];
void bfs(int a){
queue<ll> q;
int i,j;
q.push(a);
dis[a][a]=0;
while(!q.empty()){
int now=q.front();
q.pop();
for(i=0;i<v[now].size();i++){
if(vis[v[now][i]]==0){
q.push(v[now][i]);
vis[v[now][i]]=1;
dis[a][v[now][i]]=dis[a][now]+1;
}
}
}
}
int cmp(node xx,node yy){
return xx.fs>yy.fs;
}
int main(){
int i,j;
cin>>n>>m>>k;
k++;
memset(dis,0x3f,sizeof(dis));
for(i=2;i<=n;i++){
cin>>fs[i];
}
for(i=1;i<=m;i++){
cin>>x>>y;
v[x].push_back(y);
v[y].push_back(x);
}
for(i=1;i<=n;i++){
memset(vis,0,sizeof(vis));
bfs(i);
}
for(i=2;i<=n;i++){
for(j=2;j<=n;j++){
if(dis[1][j]<=k&&dis[i][j]<=k){
ma[i][++cnt[i]].id=j;
ma[i][cnt[i]].fs=fs[j];
}
}
}
for(i=2;i<=n;i++){
sort(ma[i]+1,ma[i]+cnt[i]+1,cmp);
}
ll aa,dd;
for(i=2;i<=n;i++){
for(j=2;j<=n;j++){
if(i!=j&&dis[i][j]<=k){
for(aa=1;aa<=3;aa++){
for(dd=1;dd<=3;dd++){
int ax=ma[i][aa].id;
int dx=ma[j][dd].id;
if(ax!=i&&ax!=j&&ax!=dx&&dx!=i&&dx!=j&&ax&&dx){
ans=max(ans,fs[ax]+fs[i]+fs[dx]+fs[j]);
}
}
}
}
}
}
cout<<ans;
return 0;
}