RT
#include<bits/stdc++.h>
#define x first
#define y second
#define pf push_front
#define pb push_back
#define rep(i,a,b) for(int i=a;i<(int)(b);i++)
#define r0p(i,n) rep(i,0,n)
#define r1p(i,n) rep(i,1,n+1)
#define all(a) a.begin(),a.end()
#define dbg(a) cerr<<#a<<": "<<a<<endl
#define sz(a) (int)(a.size())
#define re(a) cout<<a<<endl,exit(0)
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
const int intmx=0x3f3f3f3f;
const ll llmx=LLONG_MAX-10000ll*INT_MAX;
template <typename T> inline T abs(T a){return a<0?-a:a;}
void IO(string s=""){
if(!sz(s)) return;
freopen((s+".in").c_str(),"r",stdin);
freopen((s+".out").c_str(),"w",stdout);
}
bool stt;
#define N 2505
#define M 10005
#define L 17
int n,m,k;
ll v[N]={0};
ll dp[N][6][L][6]={0};
vector<int>b[N];
vector<int>a[N];
bool ok[N][N]={0};
queue<pair<int,int> >q;
inline void upd(int i,int e,int lev){
if(lev!=-1&&dp[i][e][lev][0]<dp[i][e][lev+1][0]){
for(int tmp=0;tmp<=e;tmp++) swap(dp[i][e][lev+1][tmp],dp[i][e][lev][tmp]);
upd(i,e,lev-1);
}
}
inline bool conf(int i,int j,int e,int l){
for(int tmp=1;tmp<=e;tmp++) if(j==dp[i][e][l][tmp]) return 1;
return 0;
}
void dfs(int st,int i,int dis){
ok[st][i]=1;
if(st!=i) a[st].push_back(i);
if(dis==k) return;
for(auto j:b[i]) if(!ok[st][j]){
dfs(st,j,dis+1);
}
}
struct P40_{
bool vis[N]={0};
ll ans=0;
void dfs(int i,int st,ll res){
if(st==4){
if(ok[i][1]) ans=max(ans,res);
return;
}
vis[i]=1;
for(auto j:a[i]) if(!vis[j]) dfs(j,st+1,res+v[j]);
vis[i]=0;
}
void solve(){
dfs(1,0,0);
re(ans);
}
}P40;
bool edd;
signed main(){
// cerr<<(&edd-&stt)/1024.0/1024.0<<endl;
// IO("holiday");
scanf("%d%d%d",&n,&m,&k);
rep(i,2,n+1) scanf("%lld",&v[i]);
r0p(i,m){
int u,vv;
scanf("%d%d",&u,&vv);
b[u].pb(vv);
b[vv].pb(u);
}
r1p(i,n){
q.push({i,-1});
ok[i][i]=1;
while(!q.empty()){
int j=q.front().x,val=q.front().y;
q.pop();
if(val==k) continue;
for(auto l:b[j]) if(!ok[i][l]){
ok[i][l]=1;
a[i].pb(l);
q.push({l,val+1});
}
}
// dfs(i,i,-1);//check i=i case
r0p(j,6) r0p(l,L) dp[i][j][l][0]=-1;
}
if(n<=50) P40.solve();
//WA: a-b-a is considered?
//split point
dp[1][0][0][0]=0;
r0p(e,5){
// dbg(e);
r1p(i,n) r0p(l,L) if(dp[i][e][l][0]>=0){
for(auto j:a[i]) if(e==4?j==1:!conf(i,j,e,l)&&dp[j][e+1][L-1][0]<dp[i][e][l][0]+v[j]){
dp[j][e+1][L-1][0]=dp[i][e][l][0]+v[j];
// dbg(l);
for(int tmp=1;tmp<=e;tmp++) dp[j][e+1][L-1][tmp]=dp[i][e][l][tmp];
dp[j][e+1][L-1][e+1]=j;
upd(j,e+1,L-2);
}
}
}
re(dp[1][5][0][0]);
exit(0);
}