水水水水水水水
#include<iostream>
#include<cstdio>
#include<cstring>
#define rep(i,l,r) for(int i=(l);i<=(r);i++)
#define per(i,r,l) for(int i=(r);i>=(l);i--)
#define random(l,r) ((l)+rand()%((r)-(l)+1))
using namespace std;
typedef unsigned long long ULL;
typedef long long LL;
const int inf=1e9+10,N=3010,M=8010;
const double eps=1e-6;
int n,p,r,cost[N],rudu[N],ans,cost2[N],rudu2[N];
int nxt[M],h[N],to[M],l;//链式向前星
int col[N],bianhao,dfn[N],low[N],tme;//染色数组、dfs序、能回到的最早祖先的时间戳、计时器。
int mystack[N],top;
bool vis[N],instack[N];
inline void addedge(int a,int b){ nxt[++l]=h[a]; h[a]=l; to[l]=b; }
void tarjan(int v){
dfn[v]=low[v]=++tme;//时间戳很重要,不能忘记。
vis[v]=instack[v]=true;
mystack[++top]=v;
for(int i=h[v];i!=0;i=nxt[i]){
int u=to[i];
if(!vis[u]){
tarjan(u);
low[v]=min(low[v],low[u]);
}else if(instack[u]) low[v]=min(low[v],dfn[u]);//为什么要在栈中才处理呢?
}
if(dfn[v]==low[v]){
col[v]=++bianhao;
instack[v]=false;
if(cost[v]!=-1) cost2[bianhao]=min(cost2[bianhao],cost[v]);
while(mystack[top]!=v){
if(cost[mystack[top]]!=-1) cost2[bianhao]=min(cost2[bianhao],cost[mystack[top]]);
col[mystack[top]]=bianhao;
instack[mystack[top]]=false;
top--;
}
top--;
}
}
inline void init(){
memset(cost,-1,sizeof(cost));
memset(cost2,127,sizeof(cost2));
cin>>n>>p;
rep(i,1,p){
int v,m;
cin>>v>>m;
cost[v]=m;
}
cin>>r;
rep(i,1,r){
int a,b;
cin>>a>>b;
addedge(a,b);
rudu[b]++;
}
}
int main(){
ios::sync_with_stdio(false); cin.tie(0);
init();
rep(i,1,n) if(rudu[i]==0&&cost[i]==-1){
cout<<"NO"<<endl<<i;
return 0;
}
rep(i,1,n) if(!vis[i]) tarjan(i);
rep(v,1,n) for(int i=h[v];i!=0;i=nxt[i]) if(col[v]!=col[to[i]]) rudu2[col[to[i]]]++;
rep(i,1,bianhao) if(rudu2[i]==0) ans+=cost2[i];
cout<<"YES"<<endl<<ans;
return 0;
}