#include <iostream>
#include <cstring>
#include <vector>
#include <queue>
#include <algorithm>
#define int long long
using namespace std;
int n , m , a[114514] , id[114514] , ans[114514] , cur , dp[114514];
vector<int> v[114514];
queue<int> q;
void get_tp()//拓扑排序
{
for(int i = 1; i <= n; i++) if(!id[i]) {q.push(i);}
while(!q.empty())
{
int t = q.front();
q.pop();
ans[++cur] = t;
for(int i = 0; i < v[t].size(); i++)
{
id[v[t][i]]--;
if(!id[v[t][i]]) q.push(v[t][i]);
}
}
}
int LDD()//二分优化LIS
{
memset(dp, 0x3f, sizeof dp);
for(int i = 1; i <= cur; i++)
{
int x = upper_bound(dp + 1 , dp + n + 1 , a[ans[i]]) - dp;
dp[x] = a[ans[i]];
}
for(int i = 1; i <= cur; i++)
{
if(dp[i] == 0x3f3f3f3f3f3f3f3f)
{
return i - 1;
}
}
return n;
}
signed main()
{
cin >> n >> m;
for(int i = 1; i <= n; i++) cin >> a[i];
for(int i = 1 , x , y; i <= m; i++)
{
cin >> x >> y;
v[x].push_back(y);
id[y]++;
}
get_tp();
//for(int i = 1; i <= cur; i++) cout << ans[i] << endl;
cout << LDD();
return 0;
}