#include #include #include using namespace std; using Graph = vector>; int N, M; Graph G(200010); bool ok[200010]; int D[200010]; int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); cin>>N>>M; for (int i=0;i>U>>V; G[U].push_back(V); G[V].push_back(U); } int L; cin>>L; vector rem(N + 1, -1); vector> q(1005); for (int i = 0; i < L; i++) { int J, K; cin >> J >> K; rem[J] = max(rem[J], K); } for (int i = 1; i <= N; i++) { if (rem[i] != -1) { q[rem[i]].push_back(i); } } for (int k = 1000; k > 0; k--) { for (int cur : q[k]) { if (rem[cur] > k) continue; for (int dst : G[cur]) { if (rem[dst] < k - 1) { rem[dst] = k - 1; q[k - 1].push_back(dst); } } } } for(int i = 1; i <= N; i++){ ok[i] = (rem[i] == -1); } if(! ok[1]) { cout << "No" << "\n"; return 0; } for (int i=1;i<=N;i++) D[i]=-1; D[1]=0; queue Q; Q.push(1); while(! Q.empty()){ int cur = Q.front(); Q.pop(); for (auto dst:G[cur]){ if(! ok[dst]) continue; if(D[dst]!=-1) continue; D[dst]=D[cur]+1; Q.push(dst); } } if(D[N]!=-1) { cout << "Yes" << "\n"; cout << D[N] << "\n"; } else cout << "No" << "\n"; return 0; }