#include<iostream>
#include<cstring>
#include<queue>
#define l first
#define r second
using namespace std;
const int N = 5e5 + 10;
int h[N], ne[N], e[N], w[N], idx, a[N];
int dist[N];
bool st[N];
int p[N];
int n, m;
int x[N], y[N];
typedef pair<int, int>d;
typedef pair<d, int>pii;
void add(int a, int b)
{
e[idx] = b, ne[idx] = h[a], h[a] = idx ++;
}
int find(int x)
{
if(p[x] != x)p[x] = find(p[x]);
return p[x];
}
void jks()
{
// memset(dist, 0x3f, sizeof dist);
// dist[0] = 1;
dist[n] = 1;
priority_queue<pii, vector<pii>, less<pii>>heap;
d t = {a[n], 1};
heap.push({t, n});
while(heap.size())
{
auto t = heap.top();
heap.pop();
// int distance = t.l;
int no = t.r;
// if(st[no])continue;
// st[no] = 1;
for(int i = h[no];i != -1;i = ne[i])
{
int j = e[i];
if(dist[j] < dist[no] + 1)
{
dist[j] = dist[no] + 1;
heap.push({{a[j], dist[j]}, j});
}
}
}
}
int main()
{
cin >> n >> m;
memset(h, -1, sizeof h);
for(int i = 1;i <= n;i++)cin >> a[i];
for(int i = 1;i <= n;i++)p[i] = i;
for(int i = 1;i <= m;i++)
{
cin >> x[i] >> y[i];
if(a[x[i]] == a[y[i]])
{
if(find(x[i]) != find(y[i]))
p[find(x[i])] = find(y[i]);
}
}
for(int i = 1;i <= m;i++)
{
if(a[x[i]] < a[y[i]])add(find(y[i]), find(x[i]));
if(a[x[i]] > a[y[i]])add(find(x[i]), find(y[i]));
}
// for(int i = 1;i <= n;i++)add(0, i, 0);
jks();
// for(int i = 1;i <= n;i++)cout << dist[i] << endl;
cout << dist[1] << endl;
return 0;
}