// Nice problem!
#include <bits/stdc++.h>
using namespace std;
const int N = 200005, oo = 1e9 + 7;
int n, m, a[N];
array<int, 2> e[2 * N];
vector<int> adj[N];
int d1[N], dn[N];
void Dijkstra(int s, int *d) {
	fill(d + 1, d + 1 + n, oo);
	d[s] = 0;
	priority_queue<pair<int, int>> pq;
	pq.emplace(0, s);
	while (pq.size()) {
		int u = pq.top().second, di = -pq.top().first;
		pq.pop();
		if (d[u] != di) continue;
		for (int v: adj[u]) {
			if (d[v] > max(d[u] + 1, a[v])) {
				pq.emplace(-(d[v] = max(d[u] + 1, a[v])), v);
			}
		}
	}
}
void solve(void) {
	cin >> n >> m;
	for (int i = 1; i <= n; i++) cin >> a[i];
	for (int i = 1, u, v; i <= m; i++) {
		cin >> u >> v;
		e[i] = {u, v};
		adj[u].emplace_back(v);
		adj[v].emplace_back(u);
	}
	Dijkstra(1, d1); Dijkstra(n, dn);
	int ans = oo;
	for (int i = 1; i <= n; i++) {
		ans = min(ans, 2 * max(d1[i], dn[i]));
	}
	for (int i = 1; i <= m; i++) {
		int u = e[i][0], v = e[i][1];
		ans = min(ans, 2 * min(max(d1[u], dn[v]), max(d1[v], dn[u])) + 1);
	}
	cout << ans;
}
signed main(void) {
    ios::sync_with_stdio(false); cin.tie(nullptr);
    
    int TEST = 1;
    while (TEST--) solve();
    
    return 0;
}
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... |