#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 const int Max = int.MaxValue / 2 - 1; (int, int) Solve() { var n = I(); var m = I(); var edges1 = new List<(int, int)>(); var edges2 = new List<(int, int)>(); for (var i = 0; i < m; i++) { var a = I() - 1; var b = I() - 1; if (I() == 1) edges1.Add((a, b)); else edges2.Add((a, b)); } var g = new StaticGraph(edges1, n, false); var dz0 = new int[n]; dz0.AsSpan().Fill(Max); dz0[0] = 0; { var q = new Queue(); q.Enqueue(0); while (q.Count > 0) { var v = q.Dequeue(); var nd = dz0[v] + 1; var adjz = g.Adjacencies(v); foreach (var (next, ei) in adjz) { if (dz0[next] <= nd) continue; dz0[next] = nd; q.Enqueue(next); } } } if (dz0[^1] < Max) return (1, dz0[^1]); var dz1 = new int[n]; dz1.AsSpan().Fill(Max); dz1[^1] = 0; { var q = new Queue(); q.Enqueue(n - 1); while (q.Count > 0) { var v = q.Dequeue(); var nd = dz1[v] + 1; var adjz = g.Adjacencies(v); foreach (var (next, ei) in adjz) { if (dz1[next] <= nd) continue; dz1[next] = nd; q.Enqueue(next); } } } var min = Max; foreach (var (a, b) in edges2) min = Math.Min(min, 1 + Math.Min(dz0[a] + dz1[b], dz0[b] + dz1[a])); if (min < Max) return (-1, min); return (0, 0); } var sns = new List(); var t = I(); for (var i = 0; i < t; i++) { var (k, v) = Solve(); if (k == 0) sns.Add("Unknown"); else { if (k > 0) sns.Add("Same"); else sns.Add("Different"); sns.Add(v.ToString()); } } Console.WriteLine(string.Join(Environment.NewLine, sns)); 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; } }