namespace LCL
{
constexpr int MAXN = 1e4 + 10, MAXV = MAXN << 2, P = 998244353;
auto min = [](auto x, auto y) { return x < y ? x : y; };
auto max = [](auto x, auto y) { return x < y ? y : x; };
auto tadd = [](auto x, auto y) { return add(x, y); };
auto cadd = [](auto x, auto y) { return x + min(y, inf - x); };
auto qmul = [](auto x, auto y) { return (x = (ull)x * y - (ull)((ld)x / P * y) * P) < 0 ? x + P : x; };
auto cmod = [](auto x) { return (x %= P) < 0 ? x + P : x; };
auto abs = [](auto x) { return x < 0 ? -x : x; };
auto lowb = [](auto x) { return x & (-x); };
int n, m, a[MAXN], w[MAXN], dfc, dfn[MAXN], low[MAXN], scc[MAXN], sidx, dp[MAXN], stk[MAXN], tp;
vi e[MAXN], g[MAXN];
bitset<MAXN> vis;
void dfs(int u)
{
if (vis[u]) return;
for (int v : g[u]) dfs(v), chkmx(dp[u], dp[v]);
dp[u] += w[u], vis[u] = 1;
}
void tarjan(int u)
{
dfn[u] = low[u] = ++dfc, stk[++tp] = u;
for (int v : e[u])
if (!dfn[v])
tarjan(v), chkmn(low[u], low[v]);
else if (!scc[v])
chkmn(low[u], dfn[v]);
if (low[u] == dfn[u])
{
sidx++;
do scc[stk[tp]] = sidx, w[sidx] += a[stk[tp]];
while (stk[tp--] ^ u);
}
}
void main()
{
cin >> n >> m;
rep(i, 1, n) cin >> a[i];
rep(i, 1, m, u, v) cin >> u >> v, e[u].eb(v);
rep(i, 1, n) if (!dfn[i]) tarjan(i);
rep(u, 1, n) for (int v : e[u]) if (scc[u] ^ scc[v]) g[scc[u]].eb(scc[v]);
rep(i, 1, sidx) dfs(i);
cout << *max_element(dp + 1, dp + 1 + sidx);
}
} // namespace LCL