#include using namespace std; using ll = long long; const int iinf = 1e9; const ll inf = 1e18; template ostream& operator<<(ostream &o, vector v) { for (int i = 0; i < v.size(); i++) o << v[i] << (i+1sync_with_stdio(false); int N, M, K; cin >> N >> M >> K; vector> G(N+1); vector C(M); vector U(M), V(M); for(int i = 0; i < M; i++){ cin >> C[i]; } for(int i = 0; i < M; i++){ cin >> U[i] >> V[i]; G[U[i]].push_back({V[i], C[i]}); G[V[i]].push_back({U[i], C[i]}); } vector> dist(N+1, vector(K+1, inf)); using T = tuple; priority_queue, greater> pq; dist[1][0] = 0; pq.emplace(0, 1, 0); while(!pq.empty()){ auto [d, v, k] = pq.top(); pq.pop(); if(d > dist[v][k]) continue; for(auto &e : G[v]){ int u = e.to; ll c = e.cost; if(dist[u][k] > d + c){ dist[u][k] = d + c; pq.emplace(dist[u][k], u, k); } if(k < K && dist[u][k+1] > d){ dist[u][k+1] = d; pq.emplace(d, u, k+1); } } } ll ans = inf; for(int k = 0; k <= K; k++){ ans = min(ans, dist[N][k]); } cout << (ans==inf?-1:ans) << "\n"; return 0; }