#1~#14 RE
#15~#20 TLE
#include<stdio.h>
#include<string.h>
#define min(a,b) a<b?a:b
#define max(a,b) a>b?a:b
typedef long long ll;
const ll INF=9223372036854775807;
const int N=2512;
inline ll read();
inline int write(ll);
ll res,a[N];
int n,m,k,f[N][N];
bool vis[N];
ll ans1[N],ans2[N];
int dfs(int step,ll ans,int now)
{
if(step==2)//折半处理
{
if(ans1[now]<ans)ans1[now]=ans;
else
if(ans2[now]<ans)ans2[now]=ans;
//if(f[now][1]<=k)
//res=max(res,ans);
return 0;
}
for(ll i=2;i<=n;i++)
{
if(!vis[i]&&f[now][i]<=k&&now!=i)
{
vis[i]=1;
dfs(step+1,ans+a[i],i);
vis[i]=0;
}
}
}
int main()
{
memset(f,0x3f,sizeof(f));
n=read();
m=read();
k=read();
for(int i=2;i<=n;i++)
a[i]=read();
for(int i=1;i<=n;i++)
f[i][i]=0;
for(int i=1;i<=m;i++)
{
ll x=read();
ll y=read();
f[x][y]=1;
f[y][x]=1;
}
for(int q=1;q<=n;q++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
f[i][j]=min(f[i][j],f[i][q]+f[q][j]);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
f[i][j]--;
dfs(0,0,1);
for(int i=1;i<=n;i++)
res=max(res,ans1[i]+ans2[i]);
write(res);
return 0;
}
inline ll read()
{
char ch=getchar();
ll x=0,f=1;
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;
}
inline int write(ll x)
{
if(x<0) putchar('-'),x=-x;
if(x>9) write(x/10);
putchar(x%10+'0');
return 0;
}