#include #include #include #include #include #include #include #include #include #include #include #include #include #define rep(i,a,b) for(int i=a;i<=b;i++) using namespace std; using ll = long long; using vec = vector; using Graph = vector; using Pair = pair; void debug1(vec v){for(auto x:v)cout << x << ' ';cout << endl;} void debug2(vector v){for(auto x:v)cout << '(' << x.first << ',' << x.second << ')' << endl;} void debug3(Graph v){rep(i,0,v.size()-1)debug1(v[i]);cout << endl;} ll st = 1000000000000009; setvisited; Graph dist(100009,vec(4,st)); int n,m,k; set>s; vector>g(100009); void dij(){ Pair p = s.begin()->second; visited.insert(p); ll now = p.first; ll cou = p.second; ll d = dist[now][cou]; for(auto next:g[now]){ if(dist[next.second][cou] > d + next.first){ s.insert({d + next.first,{next.second,cou}}); dist[next.second][cou] = d + next.first; } if(cou < 3 && dist[next.second][cou+1] > d){ s.insert({d,{next.second,cou+1}}); dist[next.second][cou+1] = d; } } while(!s.empty() && visited.count(s.begin()->second)){ s.erase(s.begin()); } if(!s.empty())dij(); } int main(){ cin >> n >> m >> k; vec c(m+1); rep(i,1,m)cin >> c[i]; rep(i,1,m){ int u,v; cin >> u >> v; g[u].push_back({c[i],v}); g[v].push_back({c[i],u}); } dist[1][0] = 0; s.insert({0,{1,0}}); dij(); ll ans = st; rep(i,0,k)ans = min(ans, dist[n][i]); if(ans < st)cout << ans << endl; else cout << -1 << endl; //rep(i,1,n)cout << dist[i][0] << " "; }