#include using namespace std; #define rep(i, n) for (int i = 0; i < (int)(n); i++) int main() { int N, M; cin >> N >> M; vector> graph(N); rep(i, M) { int u, v; cin >> u >> v; u--, v--; graph[u].push_back(v); graph[v].push_back(u); } vector observe_dists(N, -1); int L; cin >> L; rep(i, L) { int J, K; cin >> J >> K; J--; observe_dists[J] = max(observe_dists[J], K); } priority_queue> pq; rep(i, N) { if (observe_dists[i] == -1) { continue; } pq.push({observe_dists[i], i}); } while (pq.size()) { auto [dist, now] = pq.top(); pq.pop(); if (dist == 0 || observe_dists[now] != dist) { continue; } for (int next : graph[now]) { if (dist - 1 < observe_dists[next]) { continue; } observe_dists[next] = dist - 1; pq.push({next, dist - 1}); } } vector dists(N, -1); queue qu; if (observe_dists[0] == -1) { dists[0] = 0; qu.push(0); } while (qu.size()) { auto now = qu.front(); qu.pop(); for (int next : graph[now]) { if (observe_dists[next] != -1 || dists[next] != -1) { continue; } dists[next] = dists[now] + 1; qu.push(next); } } if (dists[N - 1] == -1) { cout << "No" << endl; return 0; } cout << "Yes" << endl; cout << dists[N - 1] << endl; return 0; }