#include <bits/stdc++.h>
using namespace std;
const int N = 2505;
int n , m , k;
long long a[N];
vector <int> g[N];
int x , y;
int dis[N][N];
bool vis[N] , f[N][N];
long long val[N][3];
long long ans;
int dian[N][3];
void buble_get_value(int pos ,long long value , int add)
{
if (value > val[pos][0])
{
val[pos][2] = val[pos][1];
val[pos][1] = val[pos][0];
val[pos][0] = value;
dian[pos][2] = dian[pos][1];
dian[pos][1] = dian[pos][0];
dian[pos][0] = add;
}
else if(value > val[pos][1])
{
val[pos][2] = val[pos][1];
val[pos][1] = value;
dian[pos][2] = dian[pos][1];
dian[pos][1] = add;
}
else if(value > val[pos][2])
{
val[pos][2] = value;
dian[pos][2] = add;
}
}
void bfs(int sx)
{
queue <int> q;
while (!q.empty()) q.pop();
q.push(sx);
vis[sx] = true;
dis[sx][sx] = 0;
while (!q.empty())
{
int x = q.front();
q.pop();
for (int i = 0 ; i < g[x].size() ; i++)
{
int u = g[x][i];
if(vis[u]) continue;
q.push(u);
vis[u] = true;
dis[sx][u] = dis[sx][x] + 1;
}
}
}
int main()
{
memset(dis , 0x3f , sizeof(dis));
memset(f , false , sizeof(f));
scanf("%d%d%d" , &n , &m , &k);
for (int i = 2 ; i <= n ; i++)
{
scanf("%lld" , a + i);
}
while (m--)
{
scanf("%d%d" , &x , &y);
g[x].push_back(y);
g[y].push_back(x);
}
for (int i = 1 ; i <= n ; i++)
{
memset(vis , false , sizeof(vis));
bfs(i);
}
for (int i = 1 ; i <= n ; i++)
{
for (int j = 1 ; j <= n ; j++)
{
if (dis[i][j] - 1 <= k)
{
f[i][j] = true;
f[j][i] = true;
}
}
}
for (int i = 2 ; i <= n ; i++)
{
for (int j = 2 ; j <= n ; j++)
{
long long value = a[i] + a[j];
if (i != j && f[1][i] && f[i][j])
{
buble_get_value(j , value , i);
}
}
}
for (int i = 2 ; i <= n ; i++)
{
for (int j = 2 ; j <= n ; j++)
{
for (int ik = 0 ; ik < 3 ; ik++)
{
bool flag = false;
for (int jk = 0 ; jk < 3 ; jk++)
{
if (ans < val[j][jk] + val[i][ik] && f[i][j] && i != j && dian[i][ik] != dian[j][jk] && dian[i][ik] != j && dian[j][jk] != i)
{
ans = val[j][jk] + val[i][ik];
}
}
}
}
}
printf("%lld" , ans);
return 0;
}