#include<cstdio>
#include<algorithm>
#include<vector>
#include<stack>
#include<queue>
using namespace std;
const int N=1e4+5,M=1e5+5;
struct graph{
int dfn,low,scc,val;
bool vis;
vector<int>edge;
};
graph e[N];
stack<int>sk;
int n,m,tot,id;
long long sum[N],ans;
pair<int,int> edge[M];
void tarjan(int u){
e[u].dfn=e[u].low=++tot;
sk.push(u);e[u].vis=1;
for(int v:e[u].edge){
if(!e[v].dfn){
tarjan(v);
e[u].low=min(e[u].low,e[v].low);
}else if(e[v].vis)
e[u].low=min(e[u].low,e[v].dfn);
}
if(e[u].dfn==e[u].low){
int v;++id;
do{
v=sk.top();
sk.pop();
e[v].vis=0;
e[v].scc=id;
sum[id]+=e[v].val;
}while(v!=u);
}
}
struct scc{
vector<int>edge;
int in;
};
scc o[N];
long long dp[N];
int xy[N];
void top_sort(){
queue<int>q;
for(int i=1;i<=id;i++)
if(!o[i].in) q.push(i);
while(!q.empty()){
int u=q.front();
xy[++*xy]=u;
q.pop();
for(int v:o[u].edge){
--o[v].in;
if(o[v].in)
q.push(v);
}
}
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
scanf("%d",&e[i].val);
for(int i=1;i<=m;i++){
int u,v;
scanf("%d%d",&u,&v);
edge[i].first=u;edge[i].second=v;
e[u].edge.push_back(v);
}
for(int i=1;i<=n;i++)
if(!e[i].dfn) tarjan(i);
for(int i=1;i<=m;i++){
int u=edge[i].first,v=edge[i].second;
if(e[u].scc!=e[v].scc){
o[e[v].scc].edge.push_back(e[u].scc);
o[e[u].scc].edge.push_back(e[v].scc);
++o[e[v].scc].in;
}
}
top_sort();
for(int i=1;i<=id;i++){
int u=xy[i];
dp[u]=sum[u];
for(int v:o[u].edge)
dp[u]=max(dp[u],dp[v]+sum[u]);
}
for(int i=1;i<=id;i++)
ans=max(ans,dp[i]);
printf("%lld",ans);
return 0;
}