#include<cstdio> #include<cstdlib> #include<iostream> #define oo 1147483647 using namespace std; struct node { int x,n; }e[100000]; int k[3001]; int stack[10000]; int tot=0,sum=0,st,n,o,p; int dfn[3001],low[3001]; int fen[3001][3001]; bool v[3001],sta[3001],tmp[3001]; int value[3001],d[3001]; bool map[3001][3001]; bool flag; int ans; int into[3001]; void pop(int u) { int v=stack[sum]; st++; int i=0; while (u!=v) { fen[st][++i]=v; sta[v]=false; v=stack[--sum]; } fen[st][++i]=v; sta[u]=false; sum--; fen[st][0]=i; } void tarjan(int u) { int t=k[u]; dfn[u]=low[u]=++tot; stack[++sum]=u; sta[u]=true; v[u]=true; while (t) { if (!v[e[t].x]) { tarjan(e[t].x); low[u]=min(low[u],low[e[t].x]); } else if (sta[e[t].x]) low[u]=min(dfn[e[t].x],low[u]); t=e[t].n; } if (low[u]==dfn[u]) pop(u); } void add(int a,int b) { e[++o].x=b; e[o].n=k[a]; k[a]=o; } void init() { int a,b; scanf("%d\n",&n); scanf("%d\n",&p); for (int i=1;i<=p;i++) { scanf("%d%d\n",&a,&b); value[a]=b; } int t; scanf("%d\n",&t); for (int i=1;i<=t;i++) { scanf("%d%d\n",&a,&b); add(a,b); d[b]++; map[a][b]=1; } } int main() { freopen("tarjan.in","r",stdin); freopen("tarjan.out","w",stdout); init(); for (int i=1;i<=n;i++) if (!v[i]) tarjan(i); int mi=n; for (int i=1;i<=st;i++) { into[i]=0; for (int j=1;j<=fen[i][0];j++) for (int k=1;k<=fen[i][0];k++) if (k!=j) { if (map[fen[i][j]][fen[i][k]]) d[fen[i][k]]--; } for (int j=1;j<=fen[i][0];j++) if (d[fen[i][j]]>0) into[i]=1; } int ans=oo,sum=0; for (int i=1;i<=st;i++) { if (!into[i]) { int ma=oo; for (int j=1;j<=fen[i][0];j++) if (value[fen[i][j]] && value[fen[i][j]]<ma) ma=value[fen[i][j]]; if (ma==oo) { for (int j=1;j<=fen[i][0];j++) if (fen[i][j]<ans) ans=fen[i][j]; flag=true; }else sum+=ma; } } if (flag) {printf("NO\n%d\n",ans);}else printf("YES\n%d\n",sum); return 0; }