#include <iostream>
#include <algorithm>
#include <stack>
#include <queue>
#include <vector>
using namespace std;
stack<int> s;
queue<int> tov;
int p,n,m,a,b;
int dfn[3002] = {}, low[3002] = {}, c[3002] = {};
int cnt1 = 0, cnt2 = 1, cur, temp;
int ans=3001,mon=0;
struct ps{
vector<int> nei;
int cost = 23333;
}l[3002];
struct p{
vector<int> nei;
int cost = 23333;
int ind = 0;
int num = 3002;
bool cr = false;
}nl[3002];
void Tarjan(int x){
dfn[x] = cnt1;
low[x] = cnt1;
cnt1++;
s.push(x);
for(int i=0;i<l[x].nei.size();i++){
cur = l[x].nei[i];
if(!dfn[cur]){
Tarjan(cur);
low[x] = min(low[x],low[cur]);
}
else if(!c[cur]){
low[x] = min(low[x],dfn[cur]);
}
}
if(dfn[x]==low[x]){
cur = s.top();
c[cur] = cnt2;
while(cur!=x){
s.pop();
cur = s.top();
c[cur] = cnt2;
}
s.pop();
cnt2++;
}
}
void rel(int x){
for(int i=0;i<nl[x].nei.size();i++){
cur = nl[x].nei[i];
nl[cur].ind--;
if(nl[cur].ind==0){
nl[cur].cr = true;
rel(cur);
}
}
}
int main(int argc, const char * argv[]) {
cin>>n>>p;
for(int i=0;i<p;i++){
cin>>a>>b;
l[a].cost = b;
}
cin>>m;
for(int i=0;i<m;i++){
cin>>a>>b;
l[a].nei.push_back(b);
}
for(int i=1;i<=n;i++){
if(!dfn[i]) Tarjan(i);
}
for(int i=1;i<=n;i++){
for(int j=0;j<l[i].nei.size();j++){
if(c[i]!=c[l[i].nei[j]]){
nl[c[i]].nei.push_back(c[l[i].nei[j]]);
nl[c[l[i].nei[j]]].ind++;
if(c[l[i].nei[j]]) cout<<c[i];
}
}
nl[c[i]].cost = min(nl[c[i]].cost,l[i].cost);
nl[c[i]].num = min(nl[c[i]].num,i);
}
for(int i=1;i<cnt2;i++){
tov.push(i);
}
while(!tov.empty()){
cur = tov.front();
cout<<cur<<endl;
tov.pop();
if(nl[cur].ind==0){
if(nl[cur].cr) continue;
if(nl[cur].cost!=23333){
mon+=nl[cur].cost;
nl[cur].cr = true;
rel(cur);
}
else{
ans = min(ans,nl[cur].num);
for(int i=0;i<nl[cur].nei.size();i++){
temp = nl[cur].nei[i];
nl[temp].ind--;
}
}
}
else{
tov.push(cur);
}
}
if(ans==3001){
cout<<"YES"<<endl;
cout<<mon<<endl;
}
else{
cout<<"NO"<<endl;
cout<<ans<<endl;
}
return 0;
}