#include using namespace std; //#include //using namespace atcoder; using ll = long long int; using ull = unsigned long long int; using ld = long double; constexpr ll MAX = 2000000000000000000; constexpr ld PI = 3.14159265358979; constexpr ll MOD = 0;//2024948111; ld dotorad(ld K){ return PI * K / 180.0; } ld radtodo(ld K){ return K * 180.0 / PI; } mt19937 mt; void randinit(){ srand((unsigned)time(NULL));mt = mt19937(rand()); } int main(){ ll N,M,K; cin >> N >> M >> K; vector CC(M); for(ll i = 0; i < M; i++){ cin >> CC[i]; } vector> G(N),C(N); for(ll i = 0; i < M; i++){ ll a,b; cin >> a >> b; a--;b--; G[a].emplace_back(b); G[b].emplace_back(a); C[a].emplace_back(CC[i]); C[b].emplace_back(CC[i]); } vector> memo(K + 1,vector(N,MAX)); priority_queue,vector>,greater>> que; que.emplace(0,0,0); while(!que.empty()){ auto [cost,rank,now] = que.top(); que.pop(); if(memo[rank][now] <= cost) continue; memo[rank][now] = cost; for(ll i = 0; i < G[now].size(); i++){ ll next = G[now][i],c = C[now][i]; if(rank + 1 <= K){ que.emplace(cost,rank + 1,next); } que.emplace(cost + c,rank,next); } } ll ans = MAX; for(ll i = 0; i <= K; i++){ ans = min(ans,memo[i][N - 1]); } if(ans == MAX) cout << -1 << endl; else cout << ans << endl; }