#include<bits/stdc++.h>
using namespace std;
const int MAXN=10005;
const int MAXM=100005;
struct node{
int from,to,next;
}e[MAXM],e1[MAXM];
int head[MAXN],num;
int head1[MAXN],num1;
bool instack[MAXN];
int s[MAXN],len;
int low[MAXN];
int cnt;
int belong[MAXN];
int n,m;
int f[MAXN];
vector<int>edge[MAXM];
int in[MAXN],ans[MAXN],num2;
int w[MAXN],p[MAXN];
int maxn;
void add(int u,int v){
e[++num].from=u;
e[num].to=v;
e[num].next=head[u];
head[u]=num;
}
void add1(int u,int v){
e1[++num1].from=u;
e1[num1].to=v;
e1[num1].next=head1[u];
head1[u]=num1;
}
int dfn[MAXN],tot;
void dfs(int x){
dfn[x]=low[x]=++tot;
s[++len]=x;
instack[x]=1;
for(int i=head[x];i;i=e[i].next){
int y=e[i].to;
if(!dfn[y]){
dfs(y);
low[x]=min(low[x],low[y]);
}else{
if(instack[y])low[x]=min(low[x],dfn[y]);
}
}
if(dfn[x]==low[x]){
cnt++;
while(s[len]!=x){
belong[s[len]]=cnt;
instack[s[len]]=0;
p[s[len]]=x;
w[x]+=w[s[len]];
len--;
}
instack[x]=0;
belong[x]=cnt;
p[s[len]]=x;
len--;
}
}
void topo(){
queue<int>q;
for(int i=1;i<=n;++i){
if(p[i]==i&&!in[i]){
q.push(i);
break;
}
}
while(!q.empty()){
int u=q.front();
q.pop();
ans[++num2]=u;
for(int i=0;i<edge[u].size();++i){
int v=edge[u][i];
in[v]--;
if(!in[v])q.push(v);
}
}
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;++i){
cin>>w[i];
}
for(int i=1;i<=m;++i){
int u,v;
cin>>u>>v;
add(u,v);
}
for(int i=1;i<=n;++i){
if(!dfn[i])dfs(i);
}
for(int i=1;i<=num;++i){
if(belong[e[i].from]!=belong[e[i].to]){
int u=e[i].from,v=e[i].to;
in[belong[v]]++;
edge[u].push_back(v);
edge[v].push_back(u);
}
}
topo();
for(int i=1;i<=cnt;++i){
int tmp=ans[i];
f[tmp]=w[tmp];
for(int j=1;j<edge[i].size();++j){
f[tmp]=max(f[tmp],f[edge[tmp][j-1]]+w[tmp]);
}
}
for(int i=1;i<=cnt;++i){
maxn=max(maxn,f[i]);
}
cout<<maxn<<endl;
return 0;
}