#include<bits/stdc++.h>
#define N 20005
using namespace std;
int n,a,b,m,dfn[N],low[N],cnt;
int stk[N],top,s[N],to[N];
int d[N],dp[N];
bool in[N];
int ans;
vector <int> e[N],l[N];
void tarjan(int x)
{
stk[++ top] = x;
dfn[x] = low[x] = ++ cnt;
in[x] = 1;
for(int i = 0;i < e[x].size();i ++)
{
int v = e[x][i];
if(!dfn[v])
{
tarjan(v);
low[x] = min(low[x],low[v]);
}
else if(in[v]) low[x] = min(low[x],low[v]);
}
if(dfn[x] == low[x])
{
while(stk[top] != x)
{
in[stk[top]] = 0;
s[x] += s[stk[top]];
to[stk[top]] = x;
top --;
}
to[x] = x;
in[x] = 0;
top --;
}
return;
}
void dfs(int x,int fa)
{
dp[x] = max(dp[x],dp[fa] + s[x]);
ans = max(ans,dp[x]);
for(int i = 0;i < l[x].size();i ++) dfs(l[x][i],x);
return;
}
int main()
{
freopen("P3387_4.in","r",stdin);
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin >> n >> m;
for(int i = 1;i <= n;i ++) cin >> s[i];
for(int i = 1;i <= m;i ++)
{
cin >> a >> b;
e[a].push_back(b);
}
for(int i = 1;i <= n;i ++)
{
if(!dfn[i]) tarjan(i);
}
for(int i = 1;i <= n;i ++)
{
int v = to[i];
for(int j = 0;j < e[i].size();j ++)
{
int u = e[i][j];
if(to[u] != v) l[v].push_back(u),d[u] ++;
}
}
for(int i = 1;i <= n;i ++)
{
if(!d[i] && to[i] == i) dfs(i,0);
}
cout << ans << endl;
return 0;
}