#include "bits/stdc++.h"
using namespace std;
#define int long long
#define endl "\n"
#define PII pair<int,int>
#define PIII pair<int,PII>
const int N = 1e18;
void slu() {
int n, m, k;
cin >> n >> m >> k;
vector<int> rest(n + 1);
vector<list<int>> M(n + 1);
priority_queue<PIII, vector<PIII >, greater<>> q;
vector<vector<int>> dis(k + 1, vector<int>(n + 1, N));
vector<vector<int>> vis(k + 1, vector<int>(n + 1, 0));
for (int i = 1; i <= n; i++)cin >> rest[i];
for (int i = 0; i < m; i++) {
int u, v;
cin >> u >> v;
M[u].push_back(v);
M[v].push_back(u);
}
if (k != 0)q.push({1, {1, 1}});
q.push({rest[1], {0, 1}});
//q--->{花费,{层数,目的地}}
while (!q.empty()) {
auto it = q.top();
q.pop();
int loc = it.second.second;
int stage = it.second.first;
int cost = it.first;
if (vis[stage][loc])continue;
vis[stage][loc] = 1;
for (auto i = M[loc].begin(); i != M[loc].end(); i++) {
int aim = *i;
int add = rest[aim];
if (dis[0][aim] > cost + add) {//休息
dis[0][aim] = cost + add;
q.push({dis[0][aim], {0, aim}});
}
if (stage < k && dis[stage + 1][aim] > cost + 1) {//不休息
dis[stage + 1][aim] = cost + 1;
q.push({dis[stage + 1][aim], {stage + 1, aim}});
}
}
}
int res = N;
for (int i = 0; i <= k; i++) {
res = min(res, dis[i][n]);
}
cout << res << endl;
}
signed main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int T;
cin >> T;
while (T--)slu();
}