defcheck_dijkstra(m: int) -> bool: import heapq dist = [INF] * (n + 1) dist[1] = 0 h = [(0, 1)] while h: d, x = heapq.heappop(h) for y, l in g[x]: l = 1if l > m else0 nd = dist[x] + l if nd >= dist[y]: continue dist[y] = nd heapq.heappush(h, (nd, y)) return dist[n] <= k
defcheck_01bfs(m: int) -> bool: from collections import deque dist = [INF] * (n + 1) dist[1] = 0 q = deque([1]) while q: u = q.popleft() for v, l in g[u]: l = 1if l > m else0 nd = dist[u] + l if nd < dist[v]: dist[v] = nd if l == 1: q.append(v) else: q.appendleft(v) return dist[n] <= k
# n 个电线杆,p 个可连接的边,电话公司可以为 k 根电缆的免费 n, p, k = map(int, input().split())
# 二分 + 最短路 # 在 [mn, mx] 上二分答案, # 找最大的电缆长度,大于这个长度免费 # check(m) # 将长度 > m 的记为 1,其他记为 0 # 看从 1 到 n 的最短路径是否小于等于 k # <=> 能否用 k 个免费到达终点 # true: m 大了,false:m 小了 defcheck_01bfs(m: int) -> bool: from collections import deque dist = [INF] * (n + 1) dist[1] = 0 q = deque([1]) while q: u = q.popleft() for v, l in g[u]: l = 1if l > m else0 nd = dist[u] + l if nd < dist[v]: dist[v] = nd if l == 1: q.append(v) else: q.appendleft(v) return dist[n] <= k
defcheck_dijkstra(m: int) -> bool: import heapq dist = [INF] * (n + 1) dist[1] = 0 h = [(0, 1)] while h: d, x = heapq.heappop(h) for y, l in g[x]: l = 1if l > m else0 nd = dist[x] + l if nd >= dist[y]: continue dist[y] = nd heapq.heappush(h, (nd, y)) return dist[n] <= k
INF = 10 ** 20 g = [[] * (n + 1) for _ inrange(n + 1)] mx = 0 for _ inrange(p): a, b, l = map(int, input().split()) g[a].append((b, l)) g[b].append((a, l)) if l > mx: mx = l
left, right = 0, mx while left <= right: mid = (left + right) // 2 # if check_dijkstra(mid): if check_01bfs(mid): right = mid - 1 else: left = mid + 1 print(left if left <= mx else -1)