#include<bits/stdc++.h>
using namespace std;
const int N=2501;
const int M=10000;
int n,m,k,ans;
int v[N];
vector<int> s[N];
bool w[N][N];
pair<int,int> dp[N][4];
void connect(){
for(int i=1;i<=n;i++){
queue<pair<int,int> > q;
q.push({i,0});w[i][i]=1;
while(!q.empty()){
pair<int,int> a=q.front();
q.pop();
if(a.second<=k){
for(int j=0;j<s[a.first].size();j++){
if(!w[i][s[a.first][j]]){
q.push({s[a.first][j],a.second+1});
w[i][s[a.first][j]]=1;
}
}
}
}
w[i][i]=0;
}
}
int main(){
cin>>n>>m>>k;
for(int i=2;i<=n;i++){
cin>>v[i];
}
for(int i=1;i<=m;i++){
int x,y;cin>>x>>y;
s[x].push_back(y);
s[y].push_back(x);
}
connect();
for(int i=2;i<=n;i++){
int maxx=0,maxn=0,secx=0,secn=0,thrx=0,thrn=0;
for(int j=2;j<=n;j++){
if(!w[1][j]||!w[i][j]){
continue;
}
if(v[j]>maxx){
thrx=secx;thrn=secn;
secx=maxx;secn=maxn;
maxx=v[j];maxn=j;
continue;
}
if(v[j]>secx){
thrx=secx;thrn=secn;
secx=v[j];secn=j;
continue;
}
if(v[j]>thrx){
thrx=v[j];thrn=j;
continue;
}
}
dp[i][1].first=maxx;dp[i][1].second=maxn;
dp[i][2].first=secx;dp[i][2].second=secn;
dp[i][3].first=thrx;dp[i][3].second=thrn;
}
for(int i=2;i<=n;i++){
for(int j=2;j<=n;j++){
if(dp[i][1].second&&dp[j][1].second&&w[i][j]){
int a=v[i]+v[j],b=0;
for(int x=1;x<=3;x++){
for(int y=1;y<=3;y++){
if(dp[i][x].second==0||dp[j][y].second==0) continue;
if(dp[i][x].second==j||dp[j][y].second==i) continue;
if(dp[i][x].second==dp[j][y].second) continue;
if(!dp[i][x].second||!dp[j][y].second) continue;
b=max(b,dp[i][x].first+dp[j][y].first);
}
}
a+=b;
ans=max(ans,a);
}
}
}
cout<<ans;
return 0;
}