#include <bits/stdc++.h>
#define rep(i,x,y) for(int i=x;i<=y;i++)
using namespace std;
typedef pair<int,int> PI;
const int N = 1e6 + 10;
int n,a[N],m,ans,dfn[N],low[N],tot,vis[N],num[N],cnt,in[N],f[N];
vector<int> v[N],g[N];queue<int> q;
stack<int> sta;
PI d[N];
int dis[N];
bool bits[N];
void tarjan(int p){
dfn[p]=low[p]=++tot;
sta.push(p);
vis[p]=1;
for(int i:v[p]){
if(!dfn[i]){
tarjan(i);
low[p]=min(low[p],low[i]);
}
else if(vis[i]){
low[p]=min(low[p],dfn[i]);
}
}
//删掉环上的点
if(low[p]==dfn[p]){
while(sta.top()!=p){
int y=sta.top();
sta.pop();
num[y]=p;
a[p]+=a[y];
vis[y]=0;
}
num[p]=p;vis[p]=1;
sta.pop();
}
}
void topu(){
while(q.size()){
int t=q.front();//cout<<t;
q.pop();
for(int i:g[t]){
f[i]=max(f[i],f[t]+a[i]);
ans=max(ans,f[i]);
if(!bits[i]){
q.push(i);
}
}
}
}
signed main(){
cin>>n>>m;
rep(i,1,n) cin>>a[i];
rep(i,1,m){
int x,y;
cin>>x>>y;
d[i]={x,y};
v[x].push_back(y);
}
rep(i,1,n) if(!dfn[i]) tarjan(i);
rep(i,1,m){
//cout<<vis[d[i].first]<<" "<<vis[d[i].second]<<endl;
int x=d[i].first,y=d[i].second;
if(num[x]!=num[y]){
// cout<<d[i].first<<" "<<d[i].second<<endl;
++cnt;
g[num[x]].push_back(num[y]);
in[num[x]]++;
}
}
rep(i,1,n){
if(num[i]==i&&!in[i]){
f[i]=a[i];
bits[i]=true;
q.push(i);
ans=max(ans,f[i]);
}
}topu();
cout<<ans;
return 0;
}