#include<bits/stdc++.h>
using namespace std;
int n,m,k,a[3000+10],f[3000+10][3000+10],pos[3000+10][10+10];
long long ans=0;
vector<int> son[3000+10];
queue<int> q;
void bfs(int x)
{
q.push(x);
f[x][x]=1;
while(!q.empty())
{
int t=q.front();
q.pop();
for(auto l:son[t])
if(f[x][l]<0)
f[x][l]=f[x][t]+1,q.push(l);
}
return ;
}
void work(int x,int y,int z,int p)
{
if(!x||!y||!z||!p)
return ;
if(x==y||x==z||x==p||y==z||y==p||z==p)
return ;
if(f[1][x]>k||f[x][y]>k||f[y][z]>k||f[z][p]>k||f[p][1]>k)
return ;
ans=max(ans,1ll*(a[x]+a[y]+a[z]+a[p]));
return ;
}
int main()
{
cin>>n>>m>>k;
k+=2;
memset(f,-1,sizeof(f));
memset(pos,0,sizeof(pos));
for(int i=2;i<=n;++i)
cin>>a[i];
for(int i=1;i<=m;++i)
{
int x,y;
cin>>x>>y;
son[x].push_back(y);
son[y].push_back(x);
}
bfs(1);
for(int i=2;i<=n;++i)
{
bfs(i);
for(int j=2;j<=n;++j)
{
if(f[i][j]!=-1&&f[1][j]!=-1&&f[i][j]<=k&&f[1][j]<=k&&i!=j)
{
int x=j;
if(a[x]>a[pos[i][0]])
swap(x,pos[i][0]);
if(a[x]>a[pos[i][1]])
swap(x,pos[i][1]);
if(a[x]>a[pos[i][2]])
swap(x,pos[i][2]);
}
}
}
for(int i=2;i<=n;++i)
for(int j=2;j<=n;++j)
if(i!=j&&f[i][j]!=-1&&f[i][j]<=k)
for(int x=0;x<3;++x)
for(int y=0;y<3;++y)
work(pos[i][x],i,j,pos[j][y]);
cout<<ans;
return 0;
}