#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e5 + 5;
const int NR = 1e4 + 5;
int n,m,dis[N],a[N],b[N],in[NR],fa[NR],dfn[NR],low[NR],dp[NR],cnt,sum,ans = -1;
vector<int> g[NR];
vector<int> G[NR];
bool vis[NR];
stack<int> st;
void Tarjan (int x){
st.push(x);
vis[x] = 1;
++cnt;
dfn[x] = cnt;
low[x] = cnt;
for (int i = 0; i < g[x].size(); ++i){
int nxt = g[x][i];
if (dfn[nxt] == 0){
Tarjan(nxt);
low[x] = min (low[x], low[nxt]);
}else if (vis[nxt] == 1){
low[x] = min (low[x], low[nxt]);
}
}
if (dfn[x] == low[x]){
++sum;
while (st.top() != x && !st.empty()){
int tmp = st.top(); st.pop();
fa[tmp] = sum;
vis[tmp] = 0;
dis[x] += dis[tmp];
}
fa[x] = sum;
vis[x] = 0;
st.pop();
}
return ;
}
void topo (){
queue<int> q;
for (int i = 1; i <= sum; ++i){
if (in[i] == 0){
q.push(i);
dp[i] = dis[i];
}
}
while (!q.empty()){
int tmp = q.front();
q.pop();
for (int i = 0; i < G[tmp].size(); ++i){
int nxt = G[tmp][i];
dp[nxt] = max (dp[nxt], dp[tmp] + dis[nxt]);
--in[nxt];
if (in[nxt] == 0) q.push(nxt);
}
}
return ;
}
signed main (){
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin >> n >> m;
for (int i = 1; i <= n; ++i) cin >> dis[i];
for (int i = 1; i <= m; ++i){
cin >> a[i] >> b[i];
g[a[i]].push_back(b[i]);
}
for (int i = 1; i <= n; ++i){
if (dfn[i] == 0) Tarjan(i);
}
for (int i = 1; i <= n; ++i){
int xx = fa[a[i]], yy = fa[b[i]];
if (xx != yy) {
G[xx].push_back(yy);
++in[yy];
}
}
topo();
for (int i = 1; i <= sum; ++i) ans = max (ans, dp[i]);
cout << ans << '\n';
return 0;
}