#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ull;
typedef long long ll;
inline int read() {
char c = getchar();
int res = 0;
while(c < '0' || c > '9')
c = getchar();
while(c >= '0' && c <= '9') {
res = (res << 1) + (res << 3) + (c ^ 48);
c = getchar();
}
return res;
}
inline void write(int i) {
if(i > 9)
write(i / 10);
putchar((i % 10) + '0');
}
const int N = 1e5 + 5, M = 1e6 + 5;
int n, m, sum, tim, top, s, v;
int p[N], head[N], suo[N], dfn[N], low[N], vis[N], h[N], in[N], dist[N];
stack<int>sta;
struct node{
int to, next, from;
};
node edge[M], ed[M];
void add(int x,int y){
edge[++sum].next = head[x];
edge[sum].from = x;
edge[sum].to = y;
head[x] = sum;
}
void tarjan(int x){
tim++;
top++;
low[x] = dfn[x] = tim;
sta.push(x);
vis[x] = 1;
int k = head[x];
while(k){
v = edge[k].to;
if (!dfn[v]) {
tarjan(v);
low[x] = min(low[x], low[v]);
}else if(vis[v]){
low[x] = min(low[x], dfn[v]);
}
k = edge[k].next;
}
if (dfn[x] == low[x]){
int t;
while(t = sta.top()){
sta.pop();
suo[t] = x;
vis[t] = 0;
if (x == t) break;
p[x] += p[t];
}
}
}
int tp()
{
queue <int> q;
int tot=0;
for (int i=1; i<=n;i++){
if (suo[i]==i && !in[i]){
q.push(i);
dist[i] = p[i];
}
}
while (!q.empty()){
int k = q.front();
q.pop();
for (int i = h[k]; i; i = ed[i].next){
int v = ed[i].to;
dist[v] = max(dist[v], dist[k] + p[v]);
in[v]--;
if (in[v] == 0) q.push(v);
}
}
int ans = 0;
for (int i = 1; i <= n; i++){
ans = max(ans, dist[i]);
}
return ans;
}
int main()
{
int a, b, x, y;
n = read();
m = read();
for (int i=1;i<=n;i++){
p[i] = read();
}
for (int i=1;i<=m;i++){
a = read();
b = read();
add(a, b);
}
for (int i = 1; i <= n; i++){
if (!dfn[i]){
tarjan(i);
}
}
for (int i = 1; i <= m;i++){
x = suo[edge[i].from];
y = suo[edge[i].to];
if (x != y){
s++;
ed[s].next = h[x];
ed[s].to = y;
ed[s].from = x;
h[x] = s;
in[y]++;
}
}
write(tp());
return 0;
}