#!/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: # Rekurzivně projdeme všechny potomky a zjistíme efektivní délky hran vůči aktuálnímu vrcholu effective_lengths = ((dive(child) + length, child) for length, child in edges[root]) max_length = 0 # Maximální efektivní délka hrany, kterou jsme doposud nechali ve stromu for new_length, child in sorted(effective_lengths): # Hrany setřídíme podle délek if new_length + max_length > Z: # Pokud se nová hrana nevejde spolu s doposud nejdelší hranou print(child, end=" ") # Odřežeme ji (jako delší z dvou hran, které se spolu nevejdou) else: max_length = new_length # Jinak aktualizujeme maximální délku hrany v podstromu return max_length dive(1) # Rekurzivně najdeme kořeny kromě prvního print(1) # A ten přidáme manuálně main()