RT
#include<cmath>
#include<cstdio>
#include<algorithm>
#include<queue>
using namespace std;
int head[10086],v[10086];
int headn[10086],vn[10086],dn[10005],low[10086],cont,st[10086],sd[10086],in[10005],out[10005],top,tim,anss,n,m;
bool book[10086],stm[10086];
struct li {
int to,next;
} e[100005],en[100005];
int add(int s,int t) {
e[++cont].to=t;
e[cont].next=head[s];
head[s]=cont;
}
int Nadd(int s,int t) {
en[++cont].to=t;
en[cont].next=headn[s];
headn[s]=cont;
}
int tarjan(int a) {
dn[a]=low[a]=++tim;
st[++top]=a;
stm[tim]=1;
int ak;
for(int i=head[a]; i; i=e[i].next) {
ak=e[i].to;
if(!dn[ak]) {
tarjan(ak);
low[a]=min(low[a],low[ak]);
} else if(stm[low[ak]]) {
low[a]=min(low[a],low[ak]);
}
}
if(dn[a]==low[a]) {
sd[a]=a;
while(ak=st[top--]) {
stm[dn[ak]]=0;
if(a==ak)break;
v[a]+=v[ak];
sd[ak]=a;
}
}
}
int topo() {
queue<int>q;
for(int i=1; i<=n; ++i) {
if(sd[i]==i&&!in[i]) {
q.push(i);
}
vn[i]=v[i];
}
anss=vn[q.front()];
while(!q.empty()) {
int th=q.front();
int ak;
q.pop();
for(int i=headn[th]; i; i=en[i].next) {
ak=en[i].to;
--in[ak];
if(!in[ak]) {
vn[ak]+=vn[th];
if(!out[ak])anss=max(anss,vn[ak]);
else q.push(ak);
}
}
}
}
int main() {
scanf("%d%d",&n,&m);
int ls,lss;
for(int i=1; i<=n; ++i) {
scanf("%d",&v[i]);
}
for(int i=1; i<=m; i++) {
scanf("%d%d",&ls,&lss);
add(ls,lss);
}
for(int i=1; i<=n; ++i)if(!dn[i])tarjan(i);
cont=0;
for(int i=1; i<=n; ++i) {
for(int j=head[i]; j; j=e[j].next) {
ls=sd[i],lss=sd[e[j].to];
if(ls==lss)continue;
Nadd(ls,lss);
++in[lss];
++out[ls];
}
}
topo();
printf("%d",anss);
return 0;
}