#include <bits/stdc++.h>
using namespace std;
const int MAXN=10005;
vector<int> adj[MAXN];
int low[MAXN],dfn[MAXN],bel[MAXN],weight[MAXN],indegree[MAXN], maxn[MAXN];
bool stackK[MAXN];
stack<int> st;
int timer,cmp;
void tarjan(int u) {
low[u]=dfn[u]=++timer;
st.push(u);
stackK[u]=1;
for (int i=0; i<adj[u].size(); i++) {
int v=adj[u][i];
if (!dfn[v]) {
tarjan(v);
low[u]=min(low[u],low[v]);
} else if (stackK[v]) {
low[u]=min(low[u],dfn[v]);
}
}
if(low[u]==dfn[u]) {
cmp++;
int v;
int sum=0;
do {
v=st.top();
st.pop();
stackK[v]=0;
sum+=weight[v];
bel[v]=cmp;
} while (u!=v);
maxn[cmp]=sum;
}
}
int main() {
int n,m;
cin>>n>>m;
for(int i=1; i<=n; i++) {
cin>>weight[i];
}
for(int i=0; i<m; i++) {
int u,v;
cin>>u>>v;
adj[u].push_back(v);
}
for (int i=1; i<=n; i++) {
if (!dfn[i]) {
tarjan(i);
}
}
vector<int> weight(cmp+1,0);
for (int u=1; u<=n; u++) {
for (int j=0; j<adj[u].size(); j++) {
int v=adj[u][j];
if (bel[u]!=bel[v]) {
indegree[bel[v]]++;
}
}
}
int ans=0;
for(int i=1; i<=cmp; i++) {
if (indegree[i]==0) {
ans+=maxn[i];
}
}
cout<<ans;
return 0;
}
tarjan做的