#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,k,a[2550],vis[2550];
int maxn[2550][3],gx[2550][3][3],gxd[2550][2],p[2550][2550],q[2550],ans;
vector<int> g[2550],h[2550],c[2550];
bool cmp(int x,int y){
return a[x]>a[y];
}
void dfs(int now,int u,int st){
vis[u]=1;
if(st==k)return;
for(auto i:g[u]){
if(vis[i])continue;
if(!p[now][i]){
h[now].push_back(i);
h[i].push_back(now);
p[now][i]=1;
p[i][now]=1;
}
dfs(now,i,st+1);
}
}
signed main(){
ios::sync_with_stdio(false);
cin>>n>>m>>k;
for(int i=2;i<=n;i++)cin>>a[i];
for(int i=1;i<=m;i++){
int u,v;cin>>u>>v;
g[u].push_back(v);
g[v].push_back(u);
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++)vis[j]=0;
dfs(i,i,-1);
}
for(auto i:h[1]){
for(auto j:h[i]){
if(j==1)continue;
c[j].push_back(i);
q[j]=1;
}
}
for(int i=1;i<=n;i++){
sort(c[i].begin(),c[i].end(),cmp);
for(auto j:c[i]){
for(int k=0;k<=2;k++){
if(maxn[i][k]==0){
maxn[i][k]=a[j]+a[i];
gx[i][k][1]=j;
gxd[i][k]++;
break;
}
else if(a[j]==maxn[i][k]){
gxd[i][k]++;
if(gxd[i][k]<=2)gx[i][k][gxd[i][k]]=j;
break;
}
}
}
}
for(int i=2;i<=n;i++){
if(!q[i])continue;
for(auto j:h[i]){
if(j==1||!q[j])continue;
for(int k=0;k<=2;k++){
for(int l=0;l<=2;l++){
if(gxd[i][k]==0||gxd[j][l]==0)continue;
if(gxd[i][k]==1&&gxd[j][l]==1){
if(gx[i][k][1]==j||gx[j][l][1]==i||gx[i][k][1]==gx[j][l][1])continue;
}
if(gxd[i][k]==2&&gxd[j][l]==1){
if(gx[i][k][1]==j&&gx[i][k][2]==gx[j][l][1])continue;
if(gx[i][k][1]==gx[j][l][1]&&gx[i][k][2]==j)continue;
}
if(gxd[i][k]==1&&gxd[j][l]==2){
if(gx[j][l][1]==i&&gx[j][l][2]==gx[i][k][1])continue;
if(gx[j][l][1]==gx[i][k][1]&&gx[j][l][2]==i)continue;
}
ans=max(ans,maxn[i][k]+maxn[j][l]);
}
}
}
}
cout<<ans;
}