#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
queue<int> q;
int n,m,k,cnt=0;
ll f[2507][2507],a[12345],p[2699][2698],ans=0;;
int dis[2599][2599],head[2599];
inline void first(int n){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++) dis[i][j]=0x7fffffff;
}
}
struct Edge{
int next;
int end;
}edge[30006];
inline void addedge(int start,int end){
cnt++;
edge[cnt].next=head[start];
head[start]=cnt;
edge[cnt].end=end;
}
void bfs(int start,int n){
dis[start][start]=0;
q.push(start);
while(!q.empty()){
int cur=q.front();
q.pop();
for(int i=head[cur];i!=0;i=edge[i].next){
int x=edge[i].end;
if(dis[start][x]==0x7fffffff){
dis[start][x]=dis[start][cur]+1;
q.push(x);
}
}
}
}
int main(){
cin>>n>>m>>k;
k++;
first(n);
for(int i=2;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=m;i++){
int x,y;
cin>>x>>y;
addedge(x,y);
addedge(y,x);
}
for(int i=1;i<=n;i++) bfs(i,n);
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(i!=j&&dis[1][i]<=k&&dis[i][j]<=k){
f[i][j]=a[i]+a[j];
}
else{
f[i][j]=-4e18;
}
}
}
for(int i=2;i<=n;i++){
p[i][1]=p[i][2]=p[i][3]=i;
for(int j=2;j<=n;j++){
if(f[p[i][1]][i]<f[j][i]){
p[i][3]=p[i][2];
p[i][2]=p[i][1];
p[i][1]=j;
}
if(f[p[i][2]][i]<f[j][i]){
p[i][3]=p[i][2];
p[i][2]=j;
}
if(f[p[i][3]][i]<f[j][i]){
p[i][3]=j;
}
}
}
for(int i=2;i<=n;i++){
for(int j=2;j<=n;j++){
if(i!=j&&dis[i][j]<=k){
for(int l=1;l<=3;l++){
for(int h=1;h<=3;h++){
if(p[i][l]!=j&&p[i][l]!=p[j][h]&&p[j][h]!=i){
ans=max(ans,f[p[i][l]][i]+f[p[j][h]][j]);
break;
}
}
}
}
}
}
cout<<ans;
}