// やけくそTLE解. //#define _GLIBCXX_DEBUG #include using namespace std; #define ll long long #define rep(i, n) for (ll i = 0; i < (ll)(n); i++) #define all(a) (a).begin(), (a).end() const ll INF32 = 2e9; const ll INF64 = 4e18; void printYN(bool ok){ if(ok)cout << "Yes" << endl; else cout << "No" << endl; return; } signed main() { int N, M; cin >> N >> M; vector> G(N); rep(i, M){ int u, v; cin >> u >> v; u--; v--; G[u].push_back(v); G[v].push_back(u); } vector kanshi(N, INF32); vector kakutei(N, false); priority_queue, vector>, greater>> pq; int L; cin >> L; rep(i, L){ int J, K; cin >> J >> K; J--; kanshi[J] = 1000-K; pq.push({1000-K,J}); } while(!pq.empty()){ int pos = pq.top().second; pq.pop(); if(kakutei[pos])continue; kakutei[pos] = true; rep(i, G[pos].size()){ int nex = G[pos][i]; if(kanshi[nex]>kanshi[pos]+1){ kanshi[nex]=kanshi[pos]+1; pq.push({kanshi[nex], nex}); } } } queue q; vector dist(N, INF32); dist[0] = 0; if(kanshi[0]<=1000){ printYN(0); return 0; } q.push(0); while(!q.empty()){ int pos = q.front(); q.pop(); rep(i, G[pos].size()){ int nex = G[pos][i]; if(dist[nex]!=INF32)continue; if(kanshi[nex]<=1000)continue; dist[nex] = dist[pos]+1; q.push(nex); } } if(dist[N-1]==INF32)printYN(0); else { printYN(1); cout << dist[N-1] << endl; } return 0; }