#include <bits/stdc++.h>
using namespace std;
int dp[10001];
vector<int> ed[10001];
vector<int> ned[10001];
vector<int> scc[10001];
int nva[10001];
int num=0;
int f[10001];
int va[10001]={0},vi[10001]={0},dfn[10001]={0},low[10001]={0};
stack<int> ans;
int st[100001]={0};
void dfs(int x,int d){
d++;
vi[x]=1;
low[x]=dfn[x]=d;
if(!st[x]){
st[x]=1;
ans.push(x);
}
for(int i=0;i<ed[x].size();i++){
int to=ed[x][i];
if(!vi[to]){
dfs(to,d);
low[x]=min(low[x],low[to]);
}
else {
if(st[to]==1){
low[x]=min(low[x],dfn[to]);
}
}
}
if(low[x]==dfn[x]){
num++;
do{
scc[num].push_back(ans.top());
nva[num]+=va[ans.top()];
st[ans.top()]=0;
if(ans.top()==x){
ans.pop();
break;
}
ans.pop();
}while(1);
}
}
void dfs2(int x){
dp[x]=nva[x];
for(int i=0;i<ned[x].size();i++){
int to=ned[x][i];
dfs2(to);
dp[x]=max(dp[x],dp[to]+nva[x]);
}
}
int main(int argc, char** argv) {
int n,m;
int e[100001]={0},t[100001]={0};
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>va[i];
}
for(int i=1;i<=m;i++){
int a,b;
cin>>a>>b;
e[i]=a;
t[i]=b;
ed[a].push_back(b);
}
for(int i=1;i<=n;i++){
if(!vi[i]){
dfs(i,0);
}
}
for(int i=1;i<=num;i++){
for(int j=0;j<scc[i].size();j++){
f[scc[i][j]]=i;
}
}
int in[10001];
for(int i=1;i<=m;i++){
if(f[e[i]]!=f[t[i]]){
ned[f[e[i]]].push_back(f[t[i]]);
in[f[t[i]]]++;
}
}
vector <int>node;
for(int i=1;i<=num;i++){
if(in[i]==0)node.push_back(i);
}
int maxx;
for(int i=0;i<node.size();i++){
dfs2(node[i]);
maxx=max(maxx,dp[node[i]]);
}
cout<<maxx;
return 0;
}