/* -*- coding: utf-8 -*- * * 3326.cc: No.3326 蟯ゥ莠墓弌莠コ縺ョ蟶ー譏・- yukicoder */ #include #include #include #include #include using namespace std; /* constant */ const int MAX_N = 200000; /* typedef */ using vi = vector; using qi = queue; using pii = pair; /* global variables */ vi nbrs[MAX_N]; int js[MAX_N], ks[MAX_N]; int bs[MAX_N], ds[MAX_N]; /* subroutines */ /* main */ int main() { int n, m; scanf("%d%d", &n, &m); for (int i = 0; i < m; i++) { int u, v; scanf("%d%d", &u, &v); u--, v--; nbrs[u].push_back(v); nbrs[v].push_back(u); } int l; scanf("%d", &l); for (int i = 0; i < l; i++) scanf("%d%d", js + i, ks + i), js[i]--; priority_queue pq; for (int i = 0; i < l; i++) { bs[js[i]] = ks[i] + 1; if (ks[i] > 0) pq.push({ks[i] + 1, js[i]}); } while (! pq.empty()) { auto [ub, u] = pq.top(); pq.pop(); if (ub != bs[u]) continue; int vb = ub - 1; for (auto v: nbrs[u]) if (bs[v] < vb) { bs[v] = vb; if (vb > 1) pq.push({vb, v}); } } if (bs[0] > 0) { puts("No"); return 0; } //for (int i = 0; i < n; i++) printf(" %d", bs[i]); putchar('\n'); fill(ds, ds + n, -1); ds[0] = 0; qi q; q.push(0); while (! q.empty()) { int u = q.front(); q.pop(); if (u == n - 1) break; for (auto v: nbrs[u]) if (ds[v] < 0 && bs[v] == 0) ds[v] = ds[u] + 1, q.push(v); } if (ds[n - 1] >= 0) printf("Yes\n%d\n", ds[n - 1]); else puts("No"); return 0; }