#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
vector<int>e[200005];
vector<int>f[200005];
struct point
{
int p,h;
};
bool cmp(point a,point b)
{
return a.p<b.p;
}
int y[200005];
point d[200005];
int dp[200005];
bool vis[200005];
int srh(int x,int v)
{
if(vis[x])
{
return dp[x];
}
vis[x]=true;
dp[x]=max(dp[x],v);
v=max(dp[x],v);
for(int i=0;i<f[x].size();i++)
{
if(!vis[f[x][i]])
{
dp[x]=max(dp[x],srh(f[x][i],v));
}
}
return dp[x];
}
int main()
{
int n,m;
cin>>n>>m;
dp[1]=1;
for(int i=2;i<=n;i++)
{
dp[i]=0;
vis[i]=false;
}
for(int i=1;i<=n;i++)
{
cin>>d[i].p;
y[i]=d[i].p;
d[i].h=i;
}
for(int i=1;i<=m;i++)
{
int u,v;
cin>>u>>v;
e[u].push_back(v);
e[v].push_back(u);
}
sort(d+1,d+n+1,cmp);
int tmp=1;
for(int i=1;i<=n;i++)
{
int k=d[i].h;
for(int j=0;j<e[k].size();j++)
{
if(y[e[k][j]]<y[k])
{
dp[k]=max(dp[k],dp[e[k][j]]+1);
}
}
if(i>=2&&d[i].p>d[i-1].p)
{
for(int j=tmp;j<i;j++)
{
int t=d[j].h;
for(int l=0;l<e[t].size();l++)
{
if(y[e[t][l]]==y[t])
{
f[t].push_back(e[t][l]);
}
}
}
for(int j=tmp;j<i;j++)
{
srh(j,dp[j]);
}
tmp=i;
}
}
for(int j=tmp;j<=n;j++)
{
int t=d[j].h;
for(int l=0;l<e[t].size();l++)
{
if(y[e[t][l]]==y[t])
{
f[t].push_back(e[t][l]);
}
}
}
for(int j=tmp;j<=n;j++)
{
srh(j,dp[j]);
}
cout<<dp[n]<<endl;
return 0;
}