#include <bits/stdc++.h>
#define pb push_back
using namespace std;
int main() {
int n; cin >> n;
int m; cin >> m;
vector <int> a(n + 1);
for(int i = 1; i <= n; i++) {
cin >> a[i];
}
vector <vector <int>> g(n + 1);
for(int i = 1; i <= m; i++) {
int u, v; cin >> u >> v;
g[u].pb(v);
g[v].pb(u);
}
priority_queue <pair<int,int> > pq;
vector <int> d(n + 1 ,1e9);
vector <int> mx(n + 1);
pq.push({0,1});
d[1] = 0;
mx[1] = 0;
while(!pq.empty()) {
int v = pq.top().second; pq.pop();
for(int to : g[v]) {
int Mx = max(a[to], d[v] + 1);
if(Mx < d[to]) {
d[to] = Mx;
pq.push({-d[to], to});
mx[to] = max(mx[v], a[to]);
}
}
}
vector <int> D(n + 1, 1e9);
vector <int> MX(n + 1);
pq.push({0,n});
D[n] = 0;
MX[n] = 0;
while(!pq.empty()) {
int v = pq.top().second; pq.pop();
for(int to : g[v]) {
int Mx = max(a[to], D[v] + 1);
if(Mx < D[to]) {
D[to] = Mx;
pq.push({-D[to], to});
MX[to] = max(MX[v], a[to]);
}
}
}
int ans = INT_MAX;
for(int i = 1; i<= n; i++) {
if(mx[i] == a[i] && MX[i] == a[i]) ans = min(ans, D[i] + d[i]);
}
cout << ans;
return 0;
}