#nullable enable #region var (_input, _iter) = (Array.Empty(), 0); T I() where T : IParsable { while (_iter >= _input.Length) (_input, _iter) = (Console.ReadLine()!.Trim().Split(' '), 0); return T.Parse(_input[_iter++], null); } #endregion static T[] Range(int n, Func F) => Enumerable.Range(0, n).Select(_ => F()).ToArray(); var n = I(); var m = I(); var edges = Range(m, () => (I() - 1, I() - 1)); var l = I(); var scopes = Range(l, () => (I() - 1, I())); var g = new StaticGraph(edges, n, false); var supervised = new bool[n]; var tmpbn = new bool[n]; foreach (var (j, k) in scopes) { var q1 = new Queue(); q1.Enqueue(j); tmpbn[j] = true; var q2 = new Queue(); var h = new List(){ j }; for (var _lp = 0; _lp < k; _lp++) { if (q1.Count == 0) break; while (q1.Count > 0) { var v = q1.Dequeue(); var adjz = g.Adjacencies(v); foreach (var (next, _) in adjz) { if (tmpbn[next]) continue; tmpbn[next] = true; q2.Enqueue(next); h.Add(next); } } (q1, q2) = (q2, q1); } foreach (var v in h) { supervised[v] = true; tmpbn[v] = false; } } var dists = new int[n].AsSpan(); var max = int.MaxValue / 2; dists.Fill(max); var q = new Queue(); if (!supervised[0]) { q.Enqueue(0); dists[0] = 0; } while (q.Count > 0) { var v = q.Dequeue(); var nd = dists[v] + 1; var adjz = g.Adjacencies(v); foreach (var (next, _) in adjz) { if (supervised[next] || dists[next] <= nd) continue; dists[next] = nd; q.Enqueue(next); } } var ans = dists[n - 1]; if (ans >= max) Console.WriteLine("No"); else { Console.WriteLine("Yes"); Console.WriteLine(ans); } class StaticGraph { public int N { get; } public bool Directed { get; } public ReadOnlySpan<(int next, int edgeIndex)> Adjacencies(int of) => _adjacencies.AsSpan()[_starts[of].._starts[of + 1]]; public ReadOnlySpan<(int Ab, int Ad)> Edges => _edges; readonly (int Ab, int Ad)[] _edges; readonly (int, int)[] _adjacencies; readonly int[] _starts; public StaticGraph(IReadOnlyList<(int, int)> edges, int n, bool directed) { var ez = edges.ToArray(); var el = ez.Length; var m = directed ? el : (el << 1); var starts = new int[n + 1]; for (var i = 0; i < el; i++) { var (ab, ad) = ez[i]; starts[ab + 1]++; if (!directed) starts[ad + 1]++; } for (var i = 0; i < n; i++) starts[i + 1] += starts[i]; var adjacencies = new (int, int)[m]; var counts = starts.AsSpan().ToArray(); for (var i = 0; i < el; i++) { var (ab, ad) = ez[i]; adjacencies[counts[ab]++] = (ad, i); if (!directed) adjacencies[counts[ad]++] = (ab, i); } N = n; Directed = directed; _adjacencies = adjacencies; _edges = ez; _starts = starts; } }