#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
#define pb push_back
using namespace std;
typedef long long ll;
const int N=2505,M=1e5+10;
int n,m,k,cnt[N],dis[N][N];
bool vis[N];
ll w[N],ans;
int head[N],ne;
int qu[N],quhead,qutail;
struct edge {
int v,nxt;
}e[M<<1];
void init() {
memset(head,-1,sizeof(head));
ne=0;
}
void add_edge(int u,int v) {
e[ne].v=v;
e[ne].nxt=head[u];
head[u]=ne++;
}
inline void rd(int &x) {
x=0;
char c=getchar();
while(c<'0'||c>'9') c=getchar();
while(c>='0'&&c<='9') {
x=(x<<3)+(x<<1)+(c^'0');
c=getchar();
}
}
struct node {
int id;
ll w;
node() {}
node(int _id,ll _w) {
id=_id;
w=_w;
}
bool operator <(node b) const {
return w>b.w;
}
}p[N][10];
void bfs(int s) {
memset(vis,false,sizeof(vis));
quhead=qutail=1;
qu[qutail++]=s;
dis[s][s]=-1;
vis[s]=true;
while(quhead<qutail) {
int h=qu[quhead];
quhead++;
for(int i=head[h];~i;i=e[i].nxt) {
int v=e[i].v;
if(!vis[v]) {
vis[v]=true;
qu[qutail++]=v;
dis[s][v]=dis[s][h]+1;
}
}
}
}
int main() {
init();
rd(n); rd(m); rd(k);
for(int i=2;i<=n;i++) scanf("%lld",&w[i]);
for(int i=1;i<=m;i++) {
int u,v;
rd(u); rd(v);
add_edge(u,v);
add_edge(v,u);
}
for(int i=1;i<=n;i++) bfs(i);
for(int i=2;i<=n;i++) {
if(dis[1][i]<=k) {
for(int j=2;j<=n;j++) {
if(i!=j&&dis[i][j]<=k) {
p[j][++cnt[j]]=node(i,w[i]);
sort(p[j]+1,p[j]+cnt[j]+1);
cnt[j]=min(cnt[j],5);
}
}
}
}
for(int i=2;i<=n;i++) {
for(int j=i+1;j<=n;j++) {
if(dis[i][j]<=k) {
int g=(p[i][1].id==j?2:1);
int h=(p[j][1].id==i?2:1);
if(p[i][g].id==p[j][h].id) {
int r=(p[j][h+1].id==i?h+2:h+1);
if(p[i][g].id&&p[j][r].id) ans=max(ans,w[i]+w[j]+p[i][g].w+p[j][r].w);
r=(p[i][g+1].id==j?g+2:g+1);
if(p[i][r].id&&p[j][h].id) ans=max(ans,w[i]+w[j]+p[i][r].w+p[j][h].w);
}
else {
if(p[i][g].id&&p[j][h].id) ans=max(ans,w[i]+w[j]+p[i][g].w+p[j][h].w);
}
}
}
}
printf("%lld",ans);
return 0;
}