#include<bits/stdc++.h>
using namespace std;
#define re register unsigned int
#define ll long long
char buf[1<<20],*p1,*p2;
#define gc() (p1==p2 && (p2 = (p1 = buf) + fread(buf,1,1<<20,stdin),p1==p2) ? EOF : *p1++)
template <typename T>inline void read(T &x) {
T w=1;
x=0;
char c=gc();
while(!isdigit(c)) {
(c=='-')?w=-w:w;
c=gc();
}
while(isdigit(c)) {
x=(x<<1)+(x<<3)+(c^48);
c=gc();
}
x=x*w;
}
struct edge {
int to,nxt,from;
} e[20100];
long long a[2510],head[5010],n,m,k,num,uu,vv,ans[2510][10005],tmp[2510][10005],dis[2510][10005],mx=-9223372036854775807;
void add(ll u,ll v) {
e[++num].nxt=head[u];
e[num].from=u;
e[num].to=v;
head[u]=num;
}
queue <ll>q;
void dij(ll x) {
dis[x][x]=0;
q.push(x);
while(!q.empty()) {
ll u=q.front();
q.pop();
for(re i=head[u]; i; i=e[i].nxt) {
ll tmp=e[i].to;
if(dis[x][tmp]==0x7fffffffffffffff) {
dis[x][tmp]=dis[x][u]+1;
q.push(tmp);
}
}
}
}
int main() {
freopen("P8817_17.in","r",stdin);
read(n);
for(re i=1;i<=n;++i){
for(int j=1;j<=n;++j){
dis[i][j]=0x7fffffffffffffff;
}
}
read(m);
read(k);
++k;
for(re i=2; i<=n; ++i) {
read(a[i]);
}
for(re i=1; i<=m; ++i) {
read(uu);
read(vv);
add(uu,vv);
add(vv,uu);
}
for(re i=1;i<=n;++i){
dij(i);
}
for(re i=1;i<=n;++i){
for(re j=1;j<=n;++j){
if(i!=j&&dis[1][i]<=k&&dis[i][j]<=k){
ans[i][j]=a[i]+a[j];
}else{
ans[i][j]=-9223372036854775807;
}
}
}
for(re i=2;i<=n;++i){
for(re j=2;j<=n;++j){
if(ans[tmp[i][1]][i]<ans[j][i]){
tmp[i][3]=tmp[i][2];
tmp[i][2]=tmp[i][1];
tmp[i][1]=j;
}else if(ans[tmp[i][2]][i]<ans[j][i]){
tmp[i][3]=tmp[i][2];
tmp[i][2]=j;
}else if(ans[tmp[i][3]][i]<ans[j][i]){
tmp[i][3]=j;
}
}
}
for(re i=2;i<=n;++i){
for(re j=2;j<=n;++j){
if(i!=j&&dis[i][j]<=k){
for(re ii=1;ii<=3;++ii){
for(re jj=1;jj<=3;++jj){
if(tmp[i][ii]!=j&&tmp[i][ii]!=tmp[j][jj]&&tmp[j][jj]!=i){
mx=max(mx,ans[tmp[i][ii]][i]+ans[tmp[j][jj]][j]);
break;
}
}
}
}
}
}
cout<<mx;
}