using System; using static System.Console; using System.Linq; using System.Collections.Generic; class Program { static int NN => int.Parse(ReadLine()); static int[] NList => ReadLine().Split().Select(int.Parse).ToArray(); static int[] NMi => ReadLine().Split().Select(c => int.Parse(c) - 1).ToArray(); static int[][] NMap(int n) => Enumerable.Repeat(0, n).Select(_ => NMi).ToArray(); public static void Main() { Solve(); } static void Solve() { var c = NList; var (n, m) = (c[0], c[1]); var map = NMap(m); var q = NN; var query = NMap(q); var tree = new List[n]; for (var i = 0; i < n; ++i) tree[i] = new List(); foreach (var edge in map) { tree[edge[0]].Add(edge[1]); tree[edge[1]].Add(edge[0]); } var days = new int[n]; for (var i = 1; i < n; i *= 2) { for (var j = i + 1; j <= i * 2 && j < n; ++j) days[j] = days[i] + 1; } var ans = new List<(int c, int d)>(); var INF = int.MaxValue / 2; var len = new int[n]; foreach (var que in query) { var a = que[0]; for (var i = 0; i < n; ++i) len[i] = INF; len[a] = 0; var qu = new Queue(); qu.Enqueue(a); while (qu.Count > 0) { var cur = qu.Dequeue(); foreach (var next in tree[cur]) { if (len[next] <= len[cur] + 1) continue; len[next] = len[cur] + 1; qu.Enqueue(next); } } var count = 0; var day = 0; for (var i = 0; i < n; ++i) if (i != a && len[i] < INF) { ++count; day = Math.Max(day, days[len[i]]); } ans.Add((count, day)); } WriteLine(string.Join("\n", ans.Select(ai => $"{ai.c} {ai.d}"))); } }