#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define fi first
#define se second
#define pb emplace_back
const int mod = 1e9 + 7;
const int nmax = 2e5 + 5;
int n, m, a[nmax], suf[nmax];
pair<int, int> d1[nmax], dn[nmax];
vector<int> adj[nmax];
void sub1() { // full
for (int i = n; i >= 1; --i) suf[i] = max(suf[i + 1], a[i]);
int cur = 0, ans = 0;
for (int i = 1; i < n; ++i) {
while (cur < a[i + 1] - 1) {
++cur;
++ans;
}
if (cur < suf[i + 1]) ++cur;
else if (cur > suf[i + 1]) --cur;
++ans;
}
cout << ans + cur;
}
struct node {
int dist, mx, spare, idx;
node(int _dist, int _mx, int _spare, int _idx) : dist(_dist), mx(_mx), spare(_spare), idx(_idx) {}
bool operator < (const node &other) const {
return dist < other.dist;
}
bool operator > (const node &other) const {
return dist > other.dist;
}
};
void dijkstra(int s, pair<int, int> d[]) {
priority_queue<node, vector<node>, greater<node>> pq;
pq.push({node(0, a[s], 0, s)});
d[s] = {0, 0};
int _dist, _mx, _spare, _idx;
while (!pq.empty()) {
node top = pq.top();
pq.pop();
_dist = top.dist;
_mx = top.mx;
_spare = top.spare;
_idx = top.idx;
if (_dist > d[_idx].fi) continue;
else if (_spare < d[_idx].se) continue;
for (int v : adj[_idx]) {
if (_mx > a[v]) {
if (_dist + 1 > d[v].fi) continue;
if (_dist + 1 < d[v].fi || (_dist + 1 == d[v].fi && _spare + 1 > d[v].se)) {
pq.push(node(_dist + 1, _mx, _spare + 1, v));
}
} else if (_mx == a[v]) {
if (_dist + 1 > d[v].fi) continue;
if (_dist + 1 < d[v].fi || (_dist + 1 == d[v].fi && _spare + 1 > d[v].se)) {
d[v] = {_dist + 1, _spare + 1};
pq.push(node(d[v].fi, a[v], d[v].se, v));
}
} else {
int newdist = _dist - min(0, _spare - a[v] + _mx);
if (newdist < d[v].fi) {
d[v] = {newdist, 0};
pq.push(node(d[v].fi, a[v], d[v].se, v));
}
}
}
}
}
void sub4() {
fill(d1 + 1, d1 + 1 + n, make_pair(1000000000, -1000000000));
dijkstra(1, d1);
// for (int i = 1; i <= n; ++i) cout << d1[i].fi << ' ' << d1[i].se << '\n';
fill(dn + 1, dn + 1 + n, make_pair(1000000000, -1000000000));
dijkstra(n, dn);
// for (int i = 1; i <= n; ++i) cout << dn[i].fi << ' ' << dn[i].se << '\n';
int ans = INT_MAX;
for (int i = 1; i <= n; ++i) {
ans = min(ans, d1[i].fi + dn[i].fi);
}
cout << ans;
}
signed main() {
ios_base::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
if (fopen("test.inp", "r")) {
freopen("test.inp", "r", stdin);
freopen("test.out", "w", stdout);
}
cin >> n >> m;
bool checksub1 = (m == n - 1);
for (int i = 1; i <= n; ++i) cin >> a[i];
for (int i = 1; i <= m; ++i) {
int u, v; cin >> u >> v;
adj[u].pb(v);
adj[v].pb(u);
if (u != i || v != i + 1) checksub1 = 0;
}
sub4();
return 0;
}