#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e4 + 10;
int n,m,a[maxn];
vector <int> edge[maxn],edge1[maxn];
stack <int> st;
int low[maxn],dfn[maxn],in_stack[maxn],fa[maxn],dfncnt,scccnt;
int num[maxn];
queue <int> q;
int in_dep[maxn];
int ans[maxn];
void tarjan(int u)
{
dfn[u] = low[u] = ++dfncnt,in_stack[u] = 0;
st.push(u);
for (int i = 0;i < edge[u].size();i++)
{
int v = edge[u][i];
if (!dfn[v])
tarjan(v),low[u] = min(low[u],low[v]);
else if (!in_stack[v])
low[u] = min(low[u],dfn[v]);
}
if (dfn[u] == low[u])
{
in_stack[u] = 0;
while (st.top() != u)
{
int v = st.top();
fa[v] = u;
in_stack[v] = 0,a[u] += a[v];
st.pop();
}
st.pop(),fa[u] = u;
}
}
int topo()
{
for (int u = 1;u <= n;u++)
{
for (int i = 0;i < edge[u].size();i++)
{
int v = edge[u][i];
if (fa[u] != fa[v])
edge1[u].push_back(v),in_dep[v]++;
}
}
int res = -1;
for (int i = 1;i <= n;i++)
{
if (fa[i] == i and !in_dep[i])
q.push(i),ans[i] = a[i],cout << ans[i] << '?' << endl;
}
while (!q.empty())
{
int k = q.front();
q.pop();
for (int i = 0;i < edge1[k].size();i++)
{
int v = edge1[k][i];
ans[v] = max(ans[v],ans[k] + a[v]);
in_dep[v]--;
if (!in_dep[v])
q.push(v);
}
}
for (int i = 1;i <= n;i++)
res = max(ans[i],res);
return res;
}
int main()
{
cin >> n >> m;
for (int i = 1;i <= n;i++)
cin >> a[i];
for (int i = 1;i <= m;i++)
{
int u,v;
cin >> u >> v;
edge[u].push_back(v);
}
for (int i = 1;i <= n;i++)
if (!dfn[i])
tarjan(i);
cout << topo();
return 0;
}