WA on #8,#16
#include<bits/stdc++.h>
using namespace std;
//#define int long long
const int N=3005,INF=0x3f3f3f3f;
int n,p,r,a[N],h2[N];
struct Edge{
int to,nxt;
}e[8005],e2[8005];
int head[N],tot,ans,f;
void add_edge(int u,int v)
{
e[++tot].to=v;
e[tot].nxt=head[u];
head[u]=tot;
}
int num,dfn[N],low[N],st[N],top,minn[N],ind[N],cnt,scc[N];
void tarjan(int u)
{
dfn[u]=low[u]=++num;
st[++top]=u;
for(int i=head[u];i;i=e[i].nxt)
{
int v=e[i].to;
if(!dfn[v])
{
tarjan(v);
low[u]=min(low[u],low[v]);
}
else if(!scc[v])low[u]=min(low[u],dfn[v]);
}
if(low[u]==dfn[u])
{
int x=N;cnt++;
do{
x=st[top--];
scc[x]=cnt;
minn[cnt]=min(minn[cnt],a[x]);
}while(x!=u);
}
}
void topo()
{
queue<int>q;
for(int i=1;i<=cnt;i++)
if(ind[i]==0)
{
q.push(i);
ans+=minn[i];
}
while(!q.empty())
{
int t=q.front();q.pop();
for(int i=h2[t];i;i=e2[i].nxt)
{
minn[e2[i].to]=min(minn[e2[i].to],minn[t]);
ind[e2[i].to]--;
if(ind[e2[i].to]==0)q.push(e2[i].to);
}
}
}
signed main()
{
cin.tie(0)->sync_with_stdio(0);
cin>>n;
memset(a,0x3f,sizeof(a));
memset(minn,0x3f,sizeof(minn));
cin>>p;
for(int i=1;i<=p;i++)
{
int id;cin>>id;
cin>>a[id];
}
cin>>r;
for(int i=1;i<=r;i++)
{
int u,v;cin>>u>>v;
add_edge(u,v);
}
for(int i=1;i<=n;i++)
if(!dfn[i])tarjan(i);
tot=0;
for(int i=1;i<=cnt;i++)
{
for(int j=head[i];j;j=e[j].nxt)
{
int v=e[j].to;
if(scc[i]!=scc[v])
{
ind[scc[v]]++;
e2[++tot].to=scc[v];
e2[tot].nxt=h2[scc[i]];
h2[scc[i]]=tot;
}
}
}
topo();
for(int i=1;i<=n;i++)
if(minn[scc[i]]==INF)
{
cout<<"NO\n"<<i;
return 0;
}
cout<<"YES"<<endl;
cout<<ans<<endl;
return 0;
}