#include<bits/stdc++.h>
using namespace std;
long long w[1000001];
long long h[1000001];
long long v[1000001];
long long ne[1000001];
long long dis[1000001];
long long cnt=0,s,k;
long long c[1000001];
long long vis[1000001];
long long n,m;
typedef pair<long long, long long> PI;
void dijstla() {
for(long long i=1;i<=n;i++){
vis[i]=0;
dis[i]=INT_MAX;
}
priority_queue<pair<long long,long long>, vector<pair<long long,long long> >,greater<pair<long long,long long> > > q;
dis[s]=0;
q.push({0,s});
while(!q.empty()) {
PI t=q.top();
q.pop();
long long x=t.first;
long long y=t.second;
if(vis[y]) {
continue;
}
vis[y]=1;
for(long long i=h[y]; i!=-1; i=ne[i]) {
if(y==s){
if(dis[y]<=k&&dis[y]<dis[v[i]]) {
dis[v[i]]=dis[y];
q.push({dis[v[i]],v[i]});
}
continue;
}
if(dis[y]+1<=k&&dis[y]+1<dis[v[i]]) {
dis[v[i]]=dis[y]+1;
q.push({dis[v[i]],v[i]});
}
}
}
}
long long op[2500][2500];
void add(long long x,long long y){
v[++cnt]=y;
ne[cnt]=h[x];
h[x]=cnt;
}
long long f1[1000005],f2[1000005],f3[1000005],last[1000005],last2[1000005];
int main(){
memset(h,-1,sizeof(h));
cin>>n>>m>>k;
for(long long i=2;i<=n;i++){
cin>>w[i];
}
long long ans=0;
while(m--){
long long x,y;
cin>>x>>y;
add(x,y);
add(y,x);
}
for(long long i=1;i<=n;i++){
s=i;
dijstla();
for(long long j=1;j<=n;j++){
op[i][j]=dis[j];
}
}
for(long long i=2;i<=n;i++){
if(op[1][i]==INT_MAX){
continue;
}
for(long long j=2;j<=n;j++){
if(op[i][j]==INT_MAX||j==i){
continue;
}
if(w[i]+w[j]>f1[j]){
f1[j]=w[i]+w[j];
last[j]=i;
}
}
}
for(long long i=2;i<=n;i++){
for(long long j=2;j<=n;j++){
if(op[i][j]==INT_MAX||j==i||j==last[i]){
continue;
}
if(f1[i]+w[j]>f2[j]){
f2[j]=f1[i]+w[j];
last2[j]=i;
}
}
}
for(long long i=2;i<=n;i++){
for(long long j=2;j<=n;j++){
if(op[i][j]==INT_MAX||j==i||j==last2[i]||j==last[last2[i]]||op[j][1]==INT_MAX){
continue;
}
if(f2[i]+w[j]>f3[j]){
f3[j]=f2[i]+w[j];
ans=max(ans,f3[j]);
}
}
}cout<<ans;
return 0;
}