#include #include #include #include #include #include #include #include using namespace std; #define ll long long int main(void) { ios::sync_with_stdio(false); cin.tie(nullptr); ll N, M, L; cin >> N >> M; map> d; for (ll i = 0; i < M; i++) { ll u, v; cin >> u >> v; if (!d.count(u)) { d[u] = {}; } d[u].push_back(v); if (!d.count(v)) { d[v] = {}; } d[v].push_back(u); } cin >> L; vector> mem; for (ll i = 0; i < L; i++) { ll J, K; cin >> J >> K; mem.push_back({ J, K }); if (J == 1) { cout << "No" << endl; return 0; } } sort(mem.begin(), mem.end(), [](const vector& a, const vector& b) { return a[1] > b[1]; }); vector visited(N, -1); for (ll n = 0; n < L; n++) { ll a = mem[n][0], b = mem[n][1]; if (visited[a - 1] < b) { visited[a - 1] = b; if (b == 0) { continue; } } vector stack; stack.push_back(a); vector next_move; while (!stack.empty()) { for (auto i : stack) { for (auto j : d[i]) { if (visited[j - 1] == -1 || visited[j - 1] < visited[i - 1] - 1) { visited[j - 1] = visited[i - 1] - 1; if (visited[j - 1] >= 1) { next_move.push_back(j); } } } } stack = next_move; next_move.clear(); } } vector res(N, -1); res[0] = 0; ll ans = 1; vector stack; stack.push_back(1); vector next_move; while (!stack.empty()) { for (auto i : stack) { for (auto j : d[i]) { if (visited[j - 1] == -1 && res[j - 1] == -1) { res[j - 1] = ans; next_move.push_back(j); } } } stack = next_move; next_move.clear(); ans += 1; } if (res[N - 1] != -1) { cout << "Yes" << endl; cout << res[N - 1] << endl; } else { cout << "No" << endl; } return 0; }