#6 到底是什么数据啊,看之前的帖子说 #6 有问题,但管理员又说已经修好了,一模一样的代码在 loj 能过而洛谷过不了
#include <bits/stdc++.h>
#define pii pair<int,int>
#define pil pair<int,long long>
#define pll pair<long long,long long>
#define mp_ make_pair
#define pb_ push_back
#define pob_ pop_back
#define fst first
#define snd second
#define debug cout<<"********\n";
#define reset(x,y) memset(x,y,sizeof(x))
#define fi(x) freopen(x,"r",stdin)
#define fo(x) freopen(x,"w",stdout)
#define iosf ios::sync_with_stdio(0);cin.tie(0);
#define prec(x) cout<<setprecision(x);
#define prec0(x) cout<<fixed<<setprecision(x);
#define s(x,y) x[y-1]
#define Misaka16172 sb
#define kamisako femboy
using ll = long long;
using ld = long double;
using db = double;
using ull = unsigned long long;
constexpr int inf = 0x3f3f3f3f;
constexpr ll INF = 0x3f3f3f3f3f3f3f3f;
constexpr ull mod1 = 1e9+7,mod9 = 998244353;
using namespace std;
template <class T>
inline void read(T &x){
x = 0;T w = 1;
char c = 0;
while(c<'0' || c>'9'){
if(c=='-') w = -1;
c = getchar();
}
while(c>='0' && c<='9'){
x = ((x<<3)+(x<<1))+c-'0';
c = getchar();
}
x = x*w;
}
template <class T>
inline string bin(T x){
string res = "";
if(x>>1) res = bin(x>>1);
res+=(x&1)+'0';
return res;
}
constexpr int N = 3005;
vector<int> to[N],to_[N];
inline void add_edge(int u,int v){to[u].pb_(v);}
inline void add_edge_(int u,int v){to_[u].pb_(v);}
int n,val[N];
int dfn[N],low[N],scc_id[N],sz[N],minv[N],cnt = 0,id = 0;
bool ins[N],vis[N],leg[N];
bool in[N];
stack<int> st;
void dfs(int u){
cnt++;
dfn[u] = low[u] = cnt;
ins[u] = 1;st.push(u);
for(int v:to[u]){
if(!dfn[v]){
dfs(v);
low[u] = min(low[u],low[v]);
}
else if(ins[v]) low[u] = min(low[u],dfn[v]);
}
if(dfn[u]==low[u]){
id++;
int v = -1;
while(v!=u && !st.empty()){
v = st.top();st.pop();
if(val[v]<inf) leg[id] = 1;
scc_id[v] = id,ins[v] = 0;
sz[id]++;
minv[id] = min(minv[id],val[v]);
}
}
}
void dfs2(int u){
if(vis[u]) return;
// cout<<u<<"\n";
vis[u] = 1;
for(int v:to_[u]) dfs2(v);
}
bool cmp(int a,int b){return minv[a]<minv[b];}
void solve(){
read(n);
int p;read(p);
reset(val,0x3f);
for(int i=1;i<=p;i++){
int a;read(a);
read(val[a]);
}
int m;read(m);
for(int i=1;i<=m;i++){
int u,v;read(u);read(v);
add_edge(u,v);
}
reset(minv,0x3f);
for(int i=1;i<=n;i++){
if(!dfn[i]) dfs(i);
}
for(int u=1;u<=n;u++){
for(int v:to[u]){
if(scc_id[u]!=scc_id[v]){
add_edge_(scc_id[u],scc_id[v]);
in[scc_id[v]] = 1;
}
}
}
int ans = 0;
for(int i=1;i<=id;i++){
if(!leg[i]) continue;
if(in[i]) continue;
dfs2(i);
ans+=minv[i];
bool flag = 1;
for(int i=1;i<=n;i++){
if(!vis[scc_id[i]]){flag = 0;break;}
}
if(flag){
cout<<"YES\n";
cout<<ans;
return;
}
}
cout<<"NO\n";
for(int i=1;i<=n;i++){
if(!vis[scc_id[i]]){cout<<i;return;}
}
}
int main(){
int t = 1;
// read(t);
for(int tt=1;tt<=t;tt++){
solve();
}
return 0;
}