#pragma warning(disable:4996)
#include<cstdio>
#include<iostream>
#include<queue>
#include<algorithm>
#include<cstring>
#include<string>
#include<unordered_map>
#include<stack>
#include<cmath>
#include<map>
#include<set>
using namespace std;
typedef long long LL;
const LL N = 1e4+5;
const LL M = 2e5+5;
const LL INF = 0x7ffffff;
const LL P = 1000000007;
inline int read() {
int s = 0, w = 1;
char ch = getchar();
while (ch < '0' || ch>'9') { if (ch == '-')w = -1; ch = getchar(); }
while (ch >= '0' && ch <= '9') s = s * 10 + ch - '0', ch = getchar();
return s * w;
}
struct edge {
int v, nxt;
}e[M],E[M];
int pre[N],pt[N],prE[N];
int cnt,idx;
stack<int>s;
bool vis[N];
void ade(int u, int v) {
++cnt;
e[cnt].v = v;
e[cnt].nxt = pre[u];
pre[u] = cnt;
}
void adE(int u, int v) {
++cnt;
E[cnt].v = v;
E[cnt].nxt = prE[u];
prE[u] = cnt;
}
struct node {
int dfn, low,col,v;
}a[N];
void dfs(int x) {
a[x].dfn = a[x].low = ++cnt;
s.push(x);
for (int i = pre[x]; i; i = e[i].nxt) {
int v = e[i].v;
if (!a[v].dfn) {
dfs(v);
a[x].low = min(a[x].low, a[v].low);
}
else if (!a[v].col) a[x].low = min(a[v].low, a[x].low);
}
if (a[x].dfn == a[x].low) {
int k = -1;
++idx;
do {
k = s.top();
s.pop();
a[k].col = idx;
pt[idx]+=a[k].v;
} while (k != x);
}
}
struct nod {
int u, d;
friend bool operator <(nod A, nod B) {
return B.d > A.d;
}
};
priority_queue<nod>q;
int dis[N];
int ans;
void dj(int cur) {
for (int i = 1; i <= idx; i++) dis[i] = 0, vis[i] = false;;
dis[cur] = pt[cur];
ans = max(ans, dis[cur]);
q.push(nod{ cur,dis[cur] });
while (!q.empty()) {
nod T = q.top(); q.pop();
int u = T.u, d = T.d;
if (vis[u]) continue;
vis[u] = true;
for (int i = prE[u]; i; i = E[i].nxt) {
int v = E[i].v;
if (dis[v] < d + pt[v]) {
dis[v] = d + pt[v];
ans = max(ans, dis[v]);
if (!vis[v]) q.push(nod{ v,dis[v] });
}
}
}
}
int main() {
int n = read(), m = read();
for (int i = 1; i <= n; i++) a[i].v = read();
for (int i = 1; i <= m; i++) {
int u = read(), v = read();
ade(u, v);
}
cnt = 0;
for (int i = 1; i <= n; i++) {
if (a[i].dfn) continue;
dfs(i);
}
cnt = 0;
for(int i=1;i<=n;i++)
for (int j = pre[i]; j; j = e[j].nxt) {
int v = e[j].v;
if (a[i].col != a[v].col) adE(a[i].col, a[v].col);
}
for (int i = 1; i <= idx; i++) {
dj(i);
}
printf("%d", ans);
return 0;
}