rt
#include<bits/stdc++.h>
#define mp make_pair
using namespace std;
struct G
{
int cnt;
int to[100005],ne[100005],head[10004];
void init()
{
cnt=0;
memset(to,0,sizeof(to));
memset(ne,0,sizeof(ne));
memset(head,0,sizeof(head));
}
void add(int x,int y)
{
cnt++;
to[cnt]=y;
ne[cnt]=head[x];
head[x]=cnt;
}
};
G g,t;
int n,m;
int a[10004];
stack<int> st;
int low[10004],dfn[10004],tot=0;
bool ins[10004];
int idx;
int bel[10004],q[10004];
void dfs1(int x)
{
low[x]=dfn[x]=++tot;
st.push(x);
ins[x]=true;
for(int i=g.head[x];i;i=g.ne[i])
{
int y=g.to[i];
if(!dfn[y])
{
dfs1(y);
low[x]=min(low[x],low[y]);
}
else if(ins[y])
{
low[x]=min(low[x],dfn[y]);
}
}
if(low[x]==dfn[x])
{
int vv;
idx++;
do
{
vv=st.top();
//cout<<vv<<" ";
st.pop();
ins[vv]=false;
q[idx]+=a[vv];
bel[vv]=idx;
}while(vv!=x);
//cout<<"\n";
}
}
int deg[10004];
int f[10004];
queue<int> qu;
void tp()
{
for(int i=1;i<=idx;i++)
{
if(deg[i]==0)
{
qu.push(i);
f[i]=q[i];
}
}
while(!qu.empty())
{
int x=qu.front();
qu.pop();
for(int i=t.head[x];i;i=t.ne[i])
{
int y=t.to[i];
f[y]=max(f[y],f[x]+q[y]);
deg[y]--;
//cout<<y<<" ";
if(deg[y]==0)
{
qu.push(y);
}
}
}
int ans=0;
for(int i=1;i<=idx;i++)
{
ans=max(ans,f[i]);
}
cout<<ans<<"\n";
}
//set<pair<int,int> > pp;
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>n>>m;
g.init();
t.init();
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
for(int i=1;i<=m;i++)
{
int x,y;
cin>>x>>y;
g.add(x,y);
}
for(int i=1;i<=n;i++)
{
if(!dfn[i])
{
dfs1(i);
}
}
//cout<<"\n";
for(int i=1;i<=n;i++)
{
int x=i;
for(int j=g.head[x];j;j=g.ne[j])
{
int y=g.to[j];
x=bel[x],y=bel[y];
if(x!=y/*&&pp.count(mp(x,y))==0*/)
{
t.add(x,y);
//cout<<x<<" "<<y<<"\n";
deg[y]++;
//pp.insert(mp(x,y));
}
}
}
/*for(int i=1;i<=idx;i++)
{
cout<<f[i]<<" ";
}
cout<<"\n";*/
//cout<<idx<<" "<<q[1];
tp();
/*for(int i=1;i<=idx;i++)
{
cout<<deg[i]<<" ";
}*/
return 0;
}