#!/usr/bin/env python3 def main(): N, Z = map(int, input().split()) edges = [[] for _ in range(N + 1)] # Nemusíme použít nultý index (uděláme si prostě o kousek delší pole) for i in range(2, N + 1): p, l = map(int, input().split()) edges[p].append((l, i)) # Do rodiče přidáme délku hrany a potomka def dive(root: int) -> int: max_small_length = 0 # Efektivně nejdelší hrana dlouhá nejvíc Z / 2, "krátký podstrom" min_big = (None, None) # (délka, vrchol) Efektivně nejkratší hrana delší než Z / 2, "dlouhý podstrom" for length, child in ( # Rekurzivně projdeme všechny potomky a zjistíme efektivní délky hran (dive(child) + length, child) for length, child in edges[root] ): # Netřídǐme, lineární časová složitost if length + max_small_length > Z: # Délka aspoň Z / 2, nevejde se spolu s nejdelším krátkým podstromem, odřežeme print(child, end=" ") elif length > Z // 2: # Dlouhý podstrom, ale vejde se s nejdelším krátkým podstromem if min_big[0] is None: min_big = (length, child) # Zatím jediný nalezený dlouhý podstrom elif length < min_big[0]: # Kratší než dosavadní dlouhý, ten odřežeme a nahradíme novým print(min_big[1], end=" ") min_big = (length, child) else: print(child, end=" ") # Delší než dosavadní dlouhý, rovnou odřežeme else: # Krátký podstrom max_small_length = max(length, max_small_length) # Aktualizujeme nejdelší krátký podstrom if min_big[0] is not None and max_small_length + min_big[0] > Z: # Nevejde se s nejkratším velkým podstromem, odřežeme ten print(min_big[1], end=" ") min_big = (None, None) # Pokud zůstal dlouhý podstrom, vrátíme jeho délku, jinak délku nejdelšího malého (0 pokud žádný nebyl) return min_big[0] if min_big[0] is not None else max_small_length dive(1) # Rekurzivně najdeme kořeny kromě prvního print(1) # A ten přidáme manuálně main()