#include<bits/stdc++.h>
using namespace std;
inline long long read()
{
long long x=0,f=1;
char ch=getchar();
while(!isdigit(ch))
{
if(ch=='-')
f=-1;
ch=getchar();
}
while(isdigit(ch))
{
x=(x<<1)+(x<<3)+ch-'0';
ch=getchar();
}
return x*f;
}
const int MAXN=2505;
int n,m,K;
long long x[MAXN];
struct edge
{
int v,w;
};
bool cmp(edge a,edge b)
{
return a.w>b.w;
}
unsigned long long ans;
int cnt;
bool Vis[MAXN]={1,1};
vector<edge>E[MAXN];
struct node
{
int dis,u;
bool operator<(const node& a) const {return dis>a.dis;}
};
bool f[MAXN][MAXN];
int dis[MAXN],vis[MAXN];
priority_queue<node>q;
vector<edge>e[MAXN];
void dijkstra(int n,int s)
{
for(int i=1;i<=n;i++)
dis[i]=0x3f3f3f3f,vis[i]=false;
dis[s]=0;
q.push((node){0,s});
while(!q.empty())
{
int u=q.top().u;
q.pop();
if(vis[u])
continue;
vis[u]=true;
for(int j=0;j<e[u].size();j++)
{
edge ed=e[u][j];
int v=ed.v,w=ed.w;
if(dis[v]>dis[u]+w)
dis[v]=dis[u]+w,q.push((node){dis[v],v});
}
}
}
void dfs(int s,int k,unsigned long long sum)
{
++cnt;
if(cnt==30000000)
{
printf("%lld\n",ans);
exit(0);
}
if(k==5)
{
ans=max(ans,sum);
return ;
}
int len=E[s].size();
for(int i=0;i<len;i++)
{
int v=E[s][i].v;
if(!Vis[v]&&(k!=4||(k==4&&f[1][v])))
{
Vis[v]=1;
dfs(v,k+1,sum+x[v]);
Vis[v]=0;
}
}
}
int main()
{
n=read(),m=read(),K=read();
for(int i=2;i<=n;i++)
x[i]=read();
for(int i=1;i<=m;i++)
{
int u,v;
u=read(),v=read();
e[u].push_back((edge){v,1});
e[v].push_back((edge){u,1});
}
for(int i=1;i<=n;i++)
{
dijkstra(n,i);
for(int j=1;j<=n;j++)
if(dis[j]!=0x3f3f3f3f&&dis[j]-1<=K)
f[i][j]=1,E[i].push_back((edge){j,x[j]});
sort(E[i].begin(),E[i].end(),cmp);
}
dfs(1,1,0);
printf("%lld\n",ans);
return 0;
}