#include<bits/stdc++.h>
using namespace std;
const int inf=1e6+5;
int low[inf],dfn[inf],d[inf],f[inf],head[inf],vis[inf],dis[inf],in[inf],head1[inf];
int cnt,ans,sum,n,cnt1,m,x,y,ss;
struct node{
int next,to;
}e[inf*2],e1[inf*2];
stack<int>s;
void add(int x,int y)
{
e[++cnt]={head[x],y};
head[x]=cnt;
}
void add1(int x,int y)
{
e1[++cnt1]={head1[x],y};
head1[x]=cnt1;
}
void tarjan(int x)
{
dfn[x]=low[x]=++sum;
vis[x]=1;
s.push(x);
for(int i=head[x];i;i=e[i].next)
{
int to=e[i].to;
if(!dfn[to])
tarjan(to),low[x]=min(low[x],low[to]);
else if(vis[to])
low[x]=min(low[x],dfn[to]);
}
if(dfn[x]==low[x])
{
ans++;
int y;
while(1)
{
y=s.top();
s.pop();
d[y]=ans;
f[ans]++;
vis[y]=0;
if(x==y)break;
dis[x]+=dis[y];
}
}
}
queue<int>q;
void topo()
{
for(int i=1;i<=n;i++)
if(d[i]==i&&!in[i])
q.push(i),f[i]=dis[i];
while(!q.empty())
{
int u=q.front();
q.pop();
for(int i=head1[u];i;i=e1[i].next)
{
int to=e1[i].to;
f[to]=max(f[to],f[u]+dis[to]);
in[to]--;
if(!in[to])
q.push(to);
}
}
}
void clear()
{
memset(vis,0,inf);
memset(head,0,sizeof(head));
cnt=0;
memset(e,0,sizeof(e));
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
cin>>dis[i];
for(int i=1;i<=m;i++)
cin>>x>>y,add(x,y);
for(int i=1;i<=n;i++)
if(!dfn[i]) tarjan(i);
clear();
for(int i=1;i<=n;i++)
for(int j=head[i];j;j=e[j].next)
{
int to=e[j].to;
if(d[i]!=d[to])
in[d[to]]++, add1(d[i],d[to]);
}
topo();
for(int i=1;i<=n;i++)
ss=max(ss,f[i]);
cout<<ss<<endl;
return 0;
}