#include<bits/stdc++.h>
#define int long long
using namespace std;
long long read(){
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-'){
f=-1;
}
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
return x*f;
}
struct a{
int maxn[3],d[3];
}f[2505];
int n,m,k,ans;
int point[2505];
vector<int> p[2505];
bool dis[2505][2505];
bool vis[2505];
void bfs(int di){
memset(vis,0,sizeof(vis));
vis[di]=1;
queue<pair<int,int> >q;
q.push(make_pair(di,0));
while(q.size()){
int dd=q.front().first,kk=q.front().second;
q.pop();
int l=p[dd].size();
vis[dd]=1;
dis[di][dd]=1;
dis[dd][di]=1;
if(kk<k){
for(int i=0;i<l;i++){
int s=p[dd][i];
if(vis[s]==0){
vis[s]=1;
q.push(make_pair(s,kk+1));
}
}
}
}
}
signed main(){
n=read(),m=read(),k=read();
k++;
for(int i=2;i<=n;i++)point[i]=read();
while(m--){
int x,y;
x=read(),y=read();
p[x].push_back(y);
p[y].push_back(x);
}
for(int i=1;i<=n;i++)bfs(i);
/*for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++)
cout<<dis[i][j]<<" ";
cout<<endl;
}*/
for(int i=2;i<=n;i++){
for(int j=2;j<=n;j++){
if(i!=j and dis[i][j]==1 and dis[1][j]==1){
if(point[i]+point[j]>f[i].maxn[0]){
f[i].maxn[2]=f[i].maxn[1];
f[i].d[2]=f[i].d[1];
f[i].d[1]=f[i].d[0];
f[i].maxn[1]=f[i].maxn[0];
f[i].maxn[0]=point[i]+point[j];
f[i].d[0]=j;
}else if(point[i]+point[j]>f[i].maxn[1]){
f[i].maxn[2]=f[i].maxn[1];
f[i].d[2]=f[i].d[1];
f[i].d[1]=j;
f[i].maxn[1]=point[i]+point[j];
}else if(point[i]+point[j]>f[i].maxn[2]){
f[i].maxn[2]=point[i]+point[j];
f[i].d[2]=j;
}
}
}
}
for(int i=2;i<=n;i++){
for(int j=2;j<=n;j++){
if(i!=j and dis[i][j]==1){
for(int i1=0;i1<=2;i1++){
for(int j1=0;j1<=2;j1++){
int x=f[i].d[i1];
int y=f[j].d[j1];
if(x!=j&&x!=y&&y!=i)ans=max(ans,f[i].maxn[i1]+f[j].maxn[j1]);
}
}
}
}
}
cout<<ans<<endl;
return 0;
}