#include <bits/stdc++.h>

using namespace std;
typedef long long ll ;
#define rep(i,a,n) for(int i=a ; i<n ; i++)
#define pb push_back

vector<vector<int> > adj ;
vector<ll> val,m ;
vector<bool> vis ;
ll ans ;

ll dfs(int x)
{
	if(vis[x]) return m[x] ;
	ll ma=-1e9 ;
	vis[x]=1 ;
	rep(i,0,adj[x].size())
	{
		ma=max(ma,dfs(adj[x][i])) ;
	}
	ans=max(ans,ma-val[x]) ;
	ma=max(ma,val[x]) ;
	m[x]=ma ;
	return m[x] ;
}

int main()
{
	int T=1;
	// cin >> T ;

	while(T--)
	{
		int n,me ;
		cin>>n>>me ;
		adj.resize(0) ;
		adj.resize(n) ;
		val.resize(n) ;
		rep(i,0,n) cin>>val[i] ;
		m.resize(n) ;
		rep(i,0,n) m[i]=val[i] ;
		int x,y ;
		rep(i,0,me)
		{
			cin>>x>>y ; x-- ; y-- ;
			adj[x].pb(y) ;
		}
		vis.resize(0) ;
		vis.resize(n) ;
		rep(i,0,n) vis[i]=0 ;
		ans=-1e9 ;
		rep(i,0,n)
		{
			if(!vis[i]) 
			{
				dfs(i) ;
				
			}
		}
		
		cout<<ans<<endl ;
	}
	return 0;
}
#include <bits/stdc++.h>
using namespace std;
using lint = long long;

int main() {
  int N, M;
  cin >> N >> M;
  vector<vector<int>> adj(N);
  vector<int> A(N);
  for (auto &i : A) cin >> i;
  for (int i = 0; i < M; i++) {
    int u, v;
    cin >> u >> v;
    adj[--u].emplace_back(--v);
  }
  vector<lint> dp(N, -1e18);
  lint ans = -1e18;
  for (int i = N - 1; i >= 0; i--) {
    for (auto j : adj[i]) {
      ans = max(ans, -A[i] + dp[j]);
    }
    dp[i] = max(dp[i], 1ll * A[i]);
    for (auto j : adj[i]) {
      dp[i] = max(dp[i], dp[j]);
    }
  }
  cout << ans << '\n';
  return 0;
}
