# 嘘解法?(愚直BFS + 枝刈り) from collections import defaultdict, deque INF = 10**18 N, M = map(int, input().split()) graph = [[] for _ in range(N)] for _ in range(M): u, v = map(int, input().split()) u -= 1 v -= 1 graph[u].append(v) graph[v].append(u) L = int(input()) forbidden = [0] * N pq = [] patrols = defaultdict(int) for _ in range(L): j, k = map(int, input().split()) j -= 1 patrols[j] = max(k + 1, patrols[j]) for j, k in sorted(patrols.items(), key=lambda x: x[1]): if forbidden[j] >= k: continue forbidden[j] = k que = deque([(j, k)]) while que: v, d = que.popleft() for nv in graph[v]: if forbidden[nv] < d - 1: forbidden[nv] = d - 1 que.append((nv, d - 1)) if forbidden[0] > 0 or forbidden[N - 1] > 0: print("No") exit() que = deque([0]) dist = [INF] * N dist[0] = 0 while que: v = que.popleft() for nv in graph[v]: if forbidden[nv] == 0 and dist[nv] >= INF: dist[nv] = dist[v] + 1 que.append(nv) if dist[N - 1] < INF: print("Yes") print(dist[N - 1]) else: print("No")