#include<bits/stdc++.h>
using namespace std;
#define umap unordered_map
#define uset unordered_set
#define mset multiset
#define ll long long
#define ld long double
#define ull unsigned ll
#define pii pair<int,int>
#define pll pair<ll,ll>
#define ret return
#define il inline
#define tpcTi template<class T>il
#define gc getchar
#define pc putchar
#define spe pc(' ')
#define edl pc('\n')
#define N 2502
const ll INF=9223372036854775807;
const int inf=2147483647;
int n,m,k,dis[N];
vector<int>f[N];
bool visit[N][N];
long long num[N];
vector<int>e[N];
bool cmp(int x,int y){
return num[x]>num[y];
}
int tot=0;
void bfs(int u){
queue<int>q;
q.push(u);
dis[u]=0;
while(!q.empty()){
int v=q.front();
q.pop();
if(u!=v){
visit[u][v]=true;
if(u!=1&&visit[1][v]){
f[u].push_back(v);
sort(f[u].begin(),f[u].end(),cmp);
if(f[u].size()>=4){
f[u].pop_back();
}
}
}
if(dis[v]>=k+1)continue;
for(int i=0;i<e[v].size();i++){
int x=e[v][i];
dis[x]=dis[v]+1;
q.push(x);
}
}
}
int main(void){
cin>>n>>m>>k;
for(int i=2;i<=n;i++){
cin>>num[i];
}
while(m--){
int u,v;
cin>>u>>v;
e[u].push_back(v);
e[v].push_back(u);
}
for(int i=1;i<=n;i++){
memset(dis,0x3f,sizeof(dis));
bfs(i);
}
long long ans=0;
for(int i=2;i<=n;i++){
for(int j=2;j<=n;j++){
if(visit[i][j]){
for(int kk=0;kk<f[i].size();kk++){
for(int l=0;l<f[j].size();l++){
if(f[i][kk]!=j&&f[j][l]!=i&&f[i][kk]!=f[j][l]){
ans=max(ans,num[f[i][kk]]+num[f[j][l]]+num[i]+num[j]);
}
}
}
}
}
}
cout<<ans;
ret 0;
}