#include<bits/stdc++.h>
#define ll long long
using namespace std;
long long read(){
long long x=0,f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-') f=-1;ch=getchar();}
while(isdigit(ch)){x=x*10+ch-48;ch=getchar();}
return x*f;
}
void write(long long x){
if(x<0) putchar('-'),x=-x;
if(x>9) write(x/10);
putchar(x%10+'0');
}
const int N=2510,M=10010;
int n,m,k;
int head[N],ver[M<<1],nxt[M<<1],tot;
void add(int x,int y){
ver[++tot]=y;
nxt[tot]=head[x];
head[x]=tot;
}
int v[N],a[N][N],ch[N][3];
ll w[N],c[N][3],ans;
void dfs(int x,int dep){
if(dep==k)
return;
for(int i=head[x];i;i=nxt[i]){
int y=ver[i];
if(v[y])
continue;
v[y]=1;
dfs(y,dep+1);
}
}
void down(int x,int y){
for(int i=2;i>y;i--)
c[x][i]=c[x][i-1],ch[x][i]=ch[x][i-1];
}
int main(){
n=read();m=read();k=read();
for(int i=2;i<=n;i++)
w[i]=read();
for(int i=1;i<=m;i++){
int u,V;
u=read();V=read();
add(u,V);
add(V,u);
}
for(int i=1;i<=n;i++){
memset(v,0,sizeof(v));
v[i]=1;
dfs(i,-1);
for(int j=1;j<=n;j++)
a[i][j]=v[j];
}
for(int i=2;i<=n;i++){
for(int j=2;j<=n;j++){
if(i==j||(!a[1][i])||(!a[i][j]))
continue;
for(int p=0;p<3;p++){
if(w[i]+w[j]>=c[j][p]){
down(j,p);
c[j][p]=w[i]+w[j];
ch[j][p]=i;
break;
}
}
}
}
for(int i=2;i<=n;i++){
for(int j=2;j<=n;j++){
if(i==j||(!a[i][j])||(!ch[i][0])||(!ch[j][0]))
continue;
for(int p=0;p<3;p++){
if(j==ch[i][p])
continue;
for(int q=0;q<3;q++){
if(i==ch[j][q]||ch[i][p]==ch[j][q])
continue;
ans=max(ans,c[i][p]+c[j][q]);
}
}
}
}
write(ans);
return 0;
}