#include #include #include #include #include #include #include #include #include #include #include #include using namespace std; template using pq = priority_queue, greater>; using ll = long long; vector H; vector> dijkstra(vector> &E, ll start){ ll N = E.size(), t; ll from, alt, d; pq> que; vector> dist(N, vector(2, 1e18)); que.push({0, start, 0}); dist[start][0] = 0; while(!que.empty()){ tie(d, from, t) = que.top(); que.pop(); if (dist[from][t] < d) continue; for (auto to : E[from]){ if (start == 0){ if (to < from) continue; } else{ if (to > from) continue; } if (H[to]>H[from]){ if (t == 1) continue; alt = d - (H[to]-H[from]); if (alt < dist[to][1]){ dist[to][1] = alt; que.push({dist[to][1], to, 1}); } } else{ alt = d; if (alt < dist[to][0]){ dist[to][0] = alt; que.push({dist[to][0], to, 0}); } } } } return dist; } int main(){ ll N, M, A, B, C, ans; cin >> N >> M; H.resize(N); for (int i=0; i> H[i]; vector> E(N), E2(N); for (int i=0; i> A >> B; A--; B--; E[A].push_back(B); E[B].push_back(A); } vector> dist = dijkstra(E, 0); ans = min(dist[N-1][0], dist[N-1][1]); cout << (ans == 1e18 ? -1 : -ans) << endl; dist = dijkstra(E, N-1); ans = min(dist[0][0], dist[0][1]); cout << (ans == 1e18 ? -1 : -ans) << endl; }