#include<iostream>
#include<vector>
#include<stack>
#include<cstring>
#include<cstdio>
using namespace std;
#define N 100010
vector<int>l[N],g[N];
int n,m,x,y;
int dfn[N],low[N],tc,scc[N],num,val[N],cost[N],ans[N],Max=-1;
bool vis[N];
stack<int>st;
void tarjan(int v){
dfn[v]=low[v]=++tc;
vis[v]=true;
st.push(v);
for(int i=0;i<l[v].size();i++){
int u=l[v][i];
if(!dfn[u]){
tarjan(u);
low[v]=min(low[v],low[u]);
}
else if(vis[u]){
low[v]=min(low[v],dfn[u]);
}
}
if(dfn[v]==low[v]){
vis[v]=false;
scc[v]=++num;
int u=st.top();
while(u!=v){
st.pop();
val[num]+=cost[u];
scc[u]=num;
vis[u]=false;
u=st.top();
}
val[num]+=cost[u];
st.pop();
}
}
int dfs(int v,int fa){
if(ans[v])return ans[v];
int Maxs=0;
for(int i=0;i<g[v].size();i++){
int u=g[v][i];
//cout<<u<<endl;
if(u==fa)continue;
if(ans[u]){
Maxs=max(Maxs,ans[u]);
continue;
}
else{
dfs(u,v);
Maxs=max(Maxs,ans[u]);
}
}
return ans[v]=Maxs+val[v];
}
int main(){
cin>>n>>m;
num=tc=0;
for(int i=1;i<=n;i++)cin>>cost[i];
for(int i=1;i<=m;i++){
cin>>x>>y;
if(x==y)continue;
l[x].push_back(y);
}
memset(low,0x7f,sizeof(low));
for(int i=1;i<=n;i++){
if(!dfn[i])tarjan(i);
}
for(int i=1;i<=n;i++){
for(int j=0;j<l[i].size();j++){
int u=l[i][j];
if(scc[u]!=scc[i]){
g[scc[i]].push_back(scc[u]);
//cout<<i<<" "<<u<<endl;
}
}
}
n=num;
//for(int i=1;i<=n;i++)cout<<val[i]<<" ";
for(int i=1;i<=n;i++){
if(!ans[i]){
Max=max(Max,dfs(i,-1));
}
}
cout<<Max<<endl;
}