#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll n,m,a[200009];
ll vis[100009],sta[100009],low[100009],dfn[100009],top,cnt,sum,color[100009],num[100009],du[100009],siz[100009];
vector<ll>v[200009],v2[200009];
void dfs(ll x)
{
vis[x]=1,low[x]=++cnt,dfn[x]=cnt;
sta[++top]=x;
for(ll i=0;i<v[x].size();i++)
{
ll y=v[x][i];
if(dfn[y]==0)
{
dfs(y);
low[x]=min(low[x],low[y]);
}
else if(vis[y]==1)
{
low[x]=min(dfn[y],low[x]);
}
}
if(low[x]==dfn[x])
{
ll pp=0;
do{
pp=sta[top--];
vis[pp]=0;
color[pp]=x;
siz[x]+=a[pp];
}while(x!=pp);
}
}
void toposort()
{
ll dp[10009];
queue<ll>q;
memset(dp,0,sizeof(dp));
for(ll i=1;i<=n;i++)
{
if(du[i]==0&&color[i]==i)
{
q.push(i);
dp[i]=siz[i];
}
}
while(!q.empty())
{
ll u=q.front();
q.pop();
for(ll i=0;i<v2[u].size();i++)
{
ll o=v2[u][i];
if(--du[o]==0)
{
q.push(o);
}
dp[o]=max(dp[o],dp[u]+siz[o]);
}
}
ll ooo=0;
for(ll i=1;i<=n;i++)
{
ooo=max(ooo,dp[i]);
}
cout<<ooo;
}
int main()
{
ll start[10009],to[10009];
cin>>n>>m;
for(ll i=1;i<=n;i++)
{
cin>>a[i];
}
for(ll i=1;i<=m;i++)
{
ll aa,bb;
cin>>aa>>bb;
start[i]=aa,to[i]=bb;
v[aa].push_back(bb);
}
memset(dfn,0,sizeof(dfn));
for(ll i=1;i<=n;i++)
{
if(dfn[i]==0)
{
dfs(i);
}
}
for(ll i=1;i<=m;i++)
{
ll aa=color[start[i]],bb=color[to[i]];
if(aa!=bb)
{
v2[aa].push_back(bb);
du[bb]++;
}
}
toposort();
return 0;
}