#include using namespace std; using ll = long long; #define rep(i, n) for (int i = 0; i < (int)(n); i++) const ll INF = 1e18; void solve() { ll n, m, k; cin >> n >> m >> k; vector g(n * (k + 1), vector>()); { vector c(m); rep(i, m) cin >> c[i]; rep(i, m) { ll u, v; cin >> u >> v, u--, v--; rep(j, k + 1) { g[n * j + u].emplace_back(n * j + v, c[i]); g[n * j + v].emplace_back(n * j + u, c[i]); } rep(j, k) { g[n * j + u].emplace_back(n * (j + 1) + v, 0); g[n * j + v].emplace_back(n * (j + 1) + u, 0); } } } vector dist(n * (k + 1), INF); priority_queue> que; dist[0] = 0; que.emplace(0, 0); while (!que.empty()) { auto [d, u] = que.top(); que.pop(); d = -d; if (dist[u] < d) continue; for (const auto &[v, c] : g[u]) { if (dist[v] <= dist[u] + c) continue; dist[v] = dist[u] + c; que.emplace(-dist[v], v); } } ll ans = INF; rep(j, k + 1) ans = min(ans, dist[n * j + n - 1]); if (ans == INF) ans = -1; cout << ans << '\n'; } int main() { std::cin.tie(nullptr); std::ios_base::sync_with_stdio(false); int T = 1; for (int t = 0; t < T; t++) { solve(); } return 0; }