import qualified Control.Monad as CM
import qualified Control.Monad.ST as ST
import qualified Data.Array.ST as AST
import qualified Data.Array.MArray as AM

go a ("change":strx:[]) num cur = do
  (_, a2, a3, a4) <- AM.readArray a cur
  let x = read strx
  AM.writeArray a cur (x, a2, a3, a4)
  return (num, cur)

go a ("visit":"child":strx:[]) num cur = do
  (a1, a2, a3, ch) <- AM.readArray a cur
  let k = read strx
  return (num, ch !! (k-1))

myfoldlM a num cur lls
  | null lls = do
      return (num, cur)
  | otherwise = do
      (num', cur') <- go a l num cur
      myfoldlM a num' cur' ls
    where l = head lls
          ls = tail lls

work :: [[String]] -> [String]
work lines = ST.runST $ do
  -- Node index -> (Node value, Index of this node in its parent's children list, Parent index, Children)
  a <- AST.newArray (0, 100) (0, -1, -1, []) :: ST.ST s (AST.STArray s Int (Int, Int, Int, [Int]))
  let m_lines = lines :: [[String]]
  (_, result) <- myfoldlM a 1 0 m_lines
  return $ [show result]
               

main = interact $ unlines . work . map words . tail . lines
