#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 oez = Range(m, () => (I() - 1, I() - 1, I())); bool F(int x) { var edges = new List<(int, int)>(); foreach (var (u, v, h) in oez) if (h >= x) edges.Add((u, v)); var g = new StaticGraph(edges, n, false).ToGraph(); var depth = g.Depths(0)[^1]; return depth >= 0; } var pass = 0; var fail = int.MaxValue / 2; while (Math.Abs(pass - fail) >= 2) { var mid = (pass + fail) / 2; if (F(mid)) pass = mid; else fail = mid; } if (pass == 0) Console.WriteLine("NaN"); else Console.WriteLine(pass); 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; } } class Graph { public required StaticGraph StaticGraph { get; init; } } static class GraphBaseExtensions { public static Graph ToGraph(this StaticGraph g) => new(){ StaticGraph = g }; public static Span Depths(this Graph graph, int start) { var g = graph.StaticGraph; var res = new int[g.N].AsSpan(); for (var i = 0; i < res.Length; i++) res[i] = -1; res[start] = 0; var q = new Queue(); q.Enqueue(start); while (q.Count > 0) { var v = q.Dequeue(); var adjacencies = g.Adjacencies(v); foreach (var (next, _) in adjacencies) { if (res[next] >= 0) continue; res[next] = res[v] + 1; q.Enqueue(next); } } return res; } }