#include<bits/stdc++.h>
#include<deque>
using namespace std;
const int N=1e4+10,M=1e5+10;
int fir[N],nex[M],en[M];
int dfn[N],low[N],p[N],s[N],cnt,top,c[N],du[N];
void add(int u,int v){
nex[++cnt]=fir[u];
fir[u]=cnt;
en[cnt]=v;
}
bool b[N];
int a[N],f[N];
void dfs(int u){
dfn[u]=low[u]=++top;
s[top]=u;
b[u]=true;
int t=fir[u];
while(t>0){
int v=en[t];
if(dfn[v]==0){
dfs(v);
low[u]=min(low[u],low[v]);
}
else if(b[v]) low[u]=min(low[u],low[v]);
t=nex[t];
}
if(dfn[u]==low[u]){
cnt++;
while(top>=dfn[u]){
int v=s[top--];
b[v]=false;
p[v]=cnt;
c[cnt]+=a[v];
}
}
}
bool g[N][N];
int ans;
deque<int> d;
int main(){
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
for(int i=1;i<=m;i++){
int u,v;
scanf("%d%d",&u,&v);
add(u,v);
}
cnt=0;
for(int i=1;i<=n;i++)
if(dfn[i]==0) dfs(i);
for(int i=1;i<=n;i++){
int t=fir[i];
while(t>0){
int v=en[t];
if(p[i]!=p[v]){
du[p[v]]++;
g[p[i]][p[v]]=true;
}
t=nex[t];
}
}
for(int i=1;i<=cnt;i++){
if(du[i]==0){
d.push_back(i);
f[i]=c[i];
}
}
while(!d.empty()){
int u=d.front();
d.pop_front();
for(int i=1;i<=cnt;i++)
if(g[u][i]){
f[i]=max(c[i]+f[u],f[i]);
du[i]--;
if(du[i]==0) d.push_back(i);
}
}
for(int i=1;i<=cnt;i++) ans=max(ans,f[i]);
cout<<ans<<endl;
return 0;
}