#include using namespace std; struct Data { int value, u, used; bool operator>(const Data& other) const { return value > other.value; } }; struct pair_hash { template size_t operator ( ) (const pair& p) const { auto h1 = hash{}(p.first); auto h2 = hash{}(p.second); return h1 ^ h2; // Combine the two hashes } }; void solve() { int n, m, k; cin >> n >> m >> k; vector values(m); for (int i = 0; i < m; i++) { cin >> values[i]; } unordered_map>> edges; for (int i = 0; i < m; i++) { int u, v; cin >> u >> v; edges[u].emplace_back(v, values[i]); edges[v].emplace_back(u, values[i]); } unordered_map, int, pair_hash> memo; memo[{1, 0}] = 0; priority_queue, greater> minHeap; minHeap.push({0, 1, 0}); while (!minHeap.empty()) { Data current = minHeap.top(); minHeap.pop(); int value = current.value; int u = current.u; int used = current.used; for (const auto& e : edges[u]) { int v = e.first; int cost = e.second; if (used < k) { pair key = {v, used + 1}; if (memo.find(key) == memo.end() || value < memo[key]) { memo[key] = value; minHeap.push({value, v, used + 1}); } } pair key = {v, used}; if (memo.find(key) == memo.end() || value + cost < memo[key]) { memo[key] = value + cost; minHeap.push({value + cost, v, used}); } } } int result = INT_MAX; for (int i = 0; i <= k; i++) { pair key = {n, i}; if (memo.find(key) != memo.end()) { result = min(result, memo[key]); } } if (result == INT_MAX) { result = -1; } cout << result << endl; } int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); int tc = 1; while (tc--) { solve(); } return 0; }