#include<bits/stdc++.h>
#define int long long
const int N = 1e4+5;
using namespace std;
int n,m,a[N],b[N]; 
vector<int>mp[N],mp2[N];
stack<int>sp;
int tot,cnt;
int scc[114514],dfn[114514],low[114514];
int dp[N],in[N];

bool instack[N],vis[N]; 
void tarjan(int i){
	dfn[i] = low[i] = ++tot;
	instack[i] = 1;
	sp.push(i);
	for(auto x : mp[i]){
		if(!dfn[x])
		{
			tarjan(x); 
			low[i] = min(low[i],low[x]); 
		}else if(instack[x]){
			low[i] = min(low[i],dfn[x]);
		}
	}
	if(low[i] == dfn[i])
	{
		++cnt;
		while(sp.top()!= i)
		{
			scc[sp.top()] = cnt;
			instack[sp.top()]=  0;
			b[cnt]+=a[sp.top()];
			sp.pop();
		}
		scc[i]=cnt;
		instack[i] =  0;
		b[cnt]+=a[i];
		sp.pop();
	}
} 
signed main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++)
		cin>>a[i];
	for(int i=1,a,b;i<=m;i++){
		cin>>a>>b;
		mp[a].push_back(b); 
	}
	for(int i=1;i<=n;i++){
		if(!dfn[i])tarjan(i);
	}
	for(int i=1;i<=n;i++){
		for(int v:mp[i]){
			if(scc[i]!=scc[v])
			{
				mp2[scc[i]].push_back(scc[v]);
				in[scc[v]]++;
			}
		}
	}
	queue<int>q;
	for(int i=1;i<=cnt;i++){
		if(in[i]==0){
			q.push(i);
			dp[i] = b[i];
		}
	}
	int ans=0;
	while(!q.empty()){
		int t=q.front();q.pop();
		ans=max(ans,dp[t]);
		for(auto x:mp2[t]){
			dp[x] = max(dp[x],dp[t]+b[x]);
			in[x]--;
			if(in[x]==0){
				q.push(x);
			}
		}
	}
	cout<<ans;
	return 0;
}