#include #include #include #include #include #include #include using namespace std; using namespace atcoder; using ll = long long; using mint = modint998244353; using vi = vector; using vvi = vector; using vvvi = vector; using vll = vector; using vvll = vector; using vvvll = vector; using vmi = vector; using vvmi = vector; using vvvmi = vector; #define all(a) (a).begin(), (a).end() #define rep2(i, m, n) for (int i = (m); i < (n); ++i) #define rep(i, n) rep2(i, 0, n) #define drep2(i, m, n) for (int i = (m)-1; i >= (n); --i) #define drep(i, n) drep2(i, n, 0) using p = pair; void solve(){ } int main(){ int n, m; cin >> n >> m; vvi adj(n); rep(i, m){ int u, v; cin >> u >> v; adj[u-1].push_back(v-1); adj[v-1].push_back(u-1); } int l; cin >> l; vi dist(n, -1); priority_queue

pq; rep(i, l){ int j, k; cin >> j >> k; dist[j-1] = k; if(k > 0)pq.push({k, j-1}); } while(!pq.empty()){ auto [d, u] = pq.top(); pq.pop(); if(d < dist[u])continue; for(auto v : adj[u]){ if(dist[v] == -1 || dist[v] < dist[u]-1){ dist[v] = dist[u]-1; if(dist[v] > 0)pq.push({dist[v], v}); } } } if(dist[0] >= 0 || dist[n-1] >= 0){ cout << "No" << endl; return 0; } queue q; q.push(0); vi d2(n, -1); d2[0] = 0; while(!q.empty()){ auto u = q.front(); q.pop(); for(auto v : adj[u]){ if(dist[v] >= 0)continue; if(d2[v] == -1){ d2[v] = d2[u] + 1; q.push(v); if(v == n-1){ cout << "Yes" << endl; cout << d2[n-1] << endl; return 0; } } } } cout << "No" << endl; return 0; }