#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;
}
tarjan求强连通分量