def calcs(x,y,ax,ay,bx,by) ((ax-x)*(by-y)-(bx-x)*(ay-y))/2.0 end
def inpf() a=gets.chomp.split(" ").map(&:to_f)end
def inps() a=gets.chomp.split(" ")end  
def copy(a) Marshal.load(Marshal.dump(a)) end
def kaizyo(n)(n < 2)? 1 : (2..n).inject(:*) end
def scount(a) b=na(a.max+1);a.each{|n|b[n]+=1};return b end
def na(n,d=0) Array.new(n,d)end
def na2(n,m,d=0) Array.new(n){Array.new(m,d)}end
def na3(n,m,l,d=0) Array.new(n){Array.new(m){Array.new(l,d)}}end
def bit(n) n.to_s(2).split("").map(&:to_i) end
def inp() a=gets.chomp.split(" ").map(&:to_i)end 
def mtree(x,d,p)
  ret = []
  @md = d if(d>@md)
  if(@data[x][1] > 0)
    @data[x][2..(@data[x][1]+1)].each do|nx|
      ret.push(nx)
      (mtree(nx,d+1,x))
    end
    @tab.push([x,d,p,ret])
  else
    @tab.push([x,d,p,[]])
  end
end
@md = 0
@tab = []
n = inp[0]
@data = na(n)
r = []
n.times do|d|
  @data[d] = inp
  r.concat(@data[d][2..(@data[d][1]+1)]) if(@data[d][1] > 0)
end
x = scount(r).index(0)
mtree(x,0,-1)
@tab.sort!
n.times do |d|
  j = "leaf"
  j = "internal node" if(@tab[d][3].size!=0)
  j = "root" if(@tab[d][1] == 0)
  puts "node #{@tab[d][0]}: parent = #{@tab[d][2]}, depth = #{@tab[d][1]}, #{j}, #{@tab[d][3]}"
end