#include<bits/stdc++.h>
using namespace std;
long long n,m,k,ans,sc[2555],dis[2555],vis[2505];
vector<int> v[2555],s[2555];
bool b[2505][2505],bb[2505][2505];
struct node{
long long x,fa;
};
struct Nod{
long long dis,diss,fa,ffa;
}zd[2505];
vector<node> to;
struct Node{
long long x,dis,fa;
};
void bfs(int x){//将等到达的新建边
for(int i=1;i<=n;i++)vis[i]=0;
vis[x]=1;
queue<Node> q;
Node t;t.x=x,t.dis=t.fa=-1;
q.push(t);
while(q.size()){
t=q.front();
q.pop();
int now=t.x;
for(int i=0;i<v[now].size();i++){
int y=v[now][i];
if(y==t.fa||vis[y])continue;
vis[y]=1;
if(t.dis+1<k){
Node tmp;
tmp.x=y;
tmp.fa=now;
tmp.dis=t.dis+1;
q.push(tmp);
}
if(!b[x][y])
s[x].push_back(y),b[x][y]=1;
}
}
}
int main(){
// freopen("holiday.in","r",stdin);
// freopen("holiday.out","w",stdout);
scanf("%lld%lld%lld",&n,&m,&k);
for(int i=2;i<=n;i++){
scanf("%lld",&sc[i]);
}
for(int i=1;i<=m;i++){
long long x,y;
scanf("%lld%lld",&x,&y);
v[x].push_back(y);
v[y].push_back(x);
}
for(int i=1;i<=n;i++)bfs(i);//建新边
for(int i=0;i<s[1].size();i++){
int x=s[1][i];//找与1相连的
for(int j=0;j<s[x].size();j++){
int y=s[x][j];
if(y==1)continue;
if(sc[x]>zd[y].dis){
zd[y].diss=zd[y].dis;
zd[y].dis=sc[x];
zd[y].ffa=zd[y].fa;
zd[y].fa=x;
}
else if(sc[x]>zd[y].diss){
zd[y].diss=sc[x];
zd[y].ffa=x;
}//保留最大值和次大值
}
}
// n
for(int i=1;i<=n;i++){
if(zd[i].dis){
node t;
t.x=i,t.fa=zd[i].fa;
to.push_back(t);
}
if(zd[i].diss){
node t;
t.x=i,t.fa=zd[i].ffa;
to.push_back(t);
}//进入vector
}
for(int i=0;i<to.size();i++){
for(int j=0;j<to.size();j++){
node t1=to[i];
node t2=to[j];
if(t1.x==t2.x||t1.fa==t2.fa||!b[t1.x][t2.x]||t2.x==t1.fa||t1.x==t2.fa)continue;
ans=max(ans,sc[t1.fa]+sc[t2.fa]+sc[t1.x]+sc[t2.x]);
// 枚举
}
}
cout<<ans;
return 0;
}