#include #include using namespace std; using namespace atcoder; typedef long long ll; typedef modint998244353 mint; //typedef modint1000000007 mint; void chmin(ll& a, ll b) { a = min(a, b); } void chmax(ll& a, ll b) { a = max(a, b); } int N, M; bool IsSeen[200200]; int dfs(vector>& G, vector State, int now){ if(now == N - 1){ return 0; } IsSeen[now] = true; int ans = INT_MAX / 2; for(int i = 0; i < G[now].size(); i++){ int neighbor = G[now][i]; if(State[neighbor] == -1 && !IsSeen[neighbor]){ ans = min(ans, dfs(G, State, neighbor) + 1); } } return ans; } int main() { cin >> N >> M; vector> G(N); for(int i = 0; i < M; i++){ int u, v; cin >> u >> v; u--; v--; G[u].push_back(v); G[v].push_back(u); } int L; cin >> L; queue> Q; vector State(N, -1); for(int i = 0; i < L; i++){ int J, K; cin >> J >> K; J--; if(State[J] < K){ State[J] = K; Q.push({J, K}); } } // マルチソースBFS while(!Q.empty()){ pair now = Q.front(); Q.pop(); if(State[now.first] > 0 && State[now.first] == now.second){ for(int i = 0; i < G[now.first].size(); i++){ int neighbor = G[now.first][i]; if(State[neighbor] < State[now.first] - 1){ State[neighbor] = State[now.first] - 1; Q.push({neighbor, State[neighbor]}); } } } } fill(IsSeen, IsSeen + N, false); int result = dfs(G, State, 0); if(result > INT_MAX / 3){ cout << "No" << endl; }else{ cout << "Yes" << endl; cout << result << endl; } }