#include<bits/stdc++.h>
#define ull unsigned long long
using namespace std;
vector <int> g[2501];
int n, m, k;
ull point[2501];
ull ans;
int vis[2501];
bool canBack[2501];
void input();
void dfs2(int v, int step);
void init();
void dfs(int cnt, int zhuan, ull s, int v);
int main()
{
input();
init();
dfs(0, 0, 0, 1);
cout << ans;
return 0;
}
void dfs(int cnt, int zhuan, ull s, int v)
{
int u, i;
if(cnt == 4 && canBack[v] == 1)
{
ans = max(ans, s);
return;
}
if(cnt == 4)
{
return;
}
for(i = 0; i < g[v].size(); i++)
{
u = g[v][i];
if(vis[u] == 0)
{
vis[u] = 1;
dfs(cnt + 1, 0, s + point[u], u);
vis[u] = 0;
}
if(zhuan < k)
{
dfs(cnt, zhuan + 1, s, u);
}
}
}
void init()
{
int i, u;
vis[1] = 1;
for(i = 0; i < g[1].size(); i++)
{
u = g[1][i];
canBack[u] = 1;
}
for(i = 1; i <= k; i++)
{
dfs2(1, i);
}
}
void dfs2(int v, int step)
{
int i, u;
if(step < 0)
{
return;
}
for(i = 0; i < g[v].size(); i++)
{
u = g[v][i];
if(canBack[u] == 0)
{
canBack[u] = 1;
dfs2(u, step - 1);
}
}
}
void input()
{
int i, u, v;
cin >> n >> m >> k;
for(i = 2; i <= n; i++)
{
cin >> point[i];
}
for(i = 1; i <= m; i++)
{
cin >> u >> v;
g[u].push_back(v);
g[v].push_back(u);
}
}