#include #define mp make_pair #define eb emplace_back using namespace std; using ll = long long; using wgraph = vector>>; constexpr ll inf = 2e18; vector dijkstra(int start, vector>>& g) { priority_queue, vector>, greater>> q; vector dist(g.size(), inf); dist[start] = 0; q.push(mp(0, start)); while (!q.empty()) { auto p = q.top(); q.pop(); ll now = p.second; if (dist[now] < p.first) continue; for (auto& nx : g[now]) { if (dist[nx.first] > dist[now] + nx.second) { dist[nx.first] = dist[now] + nx.second; q.push(mp(dist[nx.first], nx.first)); } } } return dist; } int n,m,u,v,k,c[200000]; int main() { cin >> n >> m >> k; wgraph g(n * (k + 1)); for(int i = 0; i < m; i++){ cin >> c[i]; } for(int i = 0; i < m; i++){ cin >> u >> v; u--,v--; for(int j = 0; j <= k; j++){ g[n * j + u].eb(mp(n * j + v,c[i])); g[n * j + v].eb(mp(n * j + u,c[i])); if(j != k){ g[n * j + u].eb(mp(n * (j + 1) + v,0)); g[n * j + v].eb(mp(n * (j + 1) + u,0)); } } } auto dist = dijkstra(0,g); ll ans = inf; for(int i = 0; i <= k; i++){ ans = min(ans,dist[n * i + n - 1]); } cout << (ans == inf ? -1 : ans) << endl; }