#include<bits/stdc++.h>
#define rep(i, a, b) for(int i = a; i <= b; i ++)
#define per(i, a, b) for(int i = a; i >= b; i --)
#define vi vector<int>
#define fi first
#define se second
#define int long long
#define endl '\n'
#define ull unsigned long long
#define ls(u) u << 1
#define rs(u) u << 1 | 1
#define sz(v) ((int) v.size())
using namespace std;
typedef long long ll;
const int N = 2e5 + 10;
int n, m, inf = 1e6;
int a[N], dist[N];
int st[N];
vector<pair<int, int>> edges[N];
void spfa(){
memset(dist, -0x3f, sizeof dist);
dist[1] = 1, st[1] = 1;
queue<pair<int, int>>q;
q.push({1, 1});
while(!q.empty()){
auto t = q.front();
q.pop();
int ver = t.se;
st[ver] = 0;
for(auto v : edges[ver]){
if(dist[v.se] < dist[ver] + v.fi){
dist[v.se] = dist[ver] + v.fi;
if(!st[v.se]){
q.push({dist[v.se], v.se});
st[v.se] = 1;
}
}
}
}
return ;
}
void solve(){
cin >> n >> m;
rep(i, 1, n) cin >> a[i];
rep(i, 1, m){
int u, v; cin >> u >> v;
if(a[u] == a[v]){
edges[u].push_back({0, v});
edges[v].push_back({0, u});
}else{
int mn = a[u] < a[v] ? u : v, mx = a[u] > a[v] ? u : v;
edges[mn].push_back({1, mx});
}
}
spfa();
cout << max((int)0, dist[n]) << endl;
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int T; T = 1;
// cin >> T;
while(T --){
solve();
}
return 0;
}