#include<bits/stdc++.h>
using namespace std;
const int N=1e4+10;
int n,m,cnt,dfn[N],low[N],in[N],st[N],top,a[N],dis[N];
vector<int>vec[N],ne[N];
bool stk[10*N];
void dfs(int u,int d){
dfn[u]=low[u]=++cnt;
st[++top]=u;
stk[u]=1;
for(auto v:vec[u]){
if(stk[v])low[u]=min(low[u],dfn[v]);
else if(!dfn[v]){
dfs(v,u);
low[u]=min(low[u],low[v]);
}
}
if(dfn[u]==low[u]){
int y;
while(y=st[top--]){
low[y]=u;
stk[y]=0;
if(u==y)break;
a[u]+=a[y];
}
}
}
int redfs(){
queue<int>q;
for(int i=1;i<=n;i++){
if(in[i]==0){
q.push(i);
dis[i]=a[i];
}
}
int ans=0;
while(!q.empty()){
int k=q.front();
q.pop();
for(auto v:ne[k]){
dis[v]=max(dis[v],dis[k]+a[v]);
in[v]--;
if(in[v]==0)q.push(v);
}
}
for(int i=1;i<=n;i++)ans=max(ans,dis[i]);
return ans;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=1;i<=m;i++){
int u,v;
cin>>u>>v;
vec[u].push_back(v);
}
for(int i=1;i<=n;i++){
if(!dfn[i]){
dfs(i,i);
}
}
for(int u=1;u<=n;u++){
for(auto v:vec[u]){
if(low[u]!=low[v]){
ne[low[u]].push_back(low[v]);
in[low[v]]++;
}
}
}
cout<<redfs();
return 0;
}