#include<stdio.h>
#define MAX 100000
#define NIL -1

int getSibling(int);
int getDepth(int);
int getHeight(int);
int getDepth(int);
void print(int);
  
struct Node{ int p,l,r;};
struct Node T[MAX];
  
int n;
int D[MAX], H[MAX];
  
int main(){   
  int i,j,v,r,l,root=0;    
  scanf("%d", &n);  
  for ( i = 0; i < n; i++ ){   
    T[i].p = NIL;   
  }
  
  for (i=0; i<n; i++){
    scanf("%d %d %d", &v,&r,&l);  
      T[v].l = l;
      T[v].r = r;     
      if(r!=NIL) T[r].p=v;
      if(l!=NIL) T[l].p=v;    
  }   
    
  for (i=0; i<n; i++){     
    if(T[i].p==NIL) root=i;
  }
    getDepth(root);
    getHeight(root);
    for(i=0;i<n;i++) print(i);
    return 0;   
}  
      
int getDepth(int u){    
  int d=0;
  while(1){
    u=T[u].p;
    if(u == NIL) break;
    d++;
  } 
  return d;
}

int getHeight(int u){
  int h1=0, h2=0;
  if(T[u].l != NIL){
    h1 = getHeight(T[u].l)+1;
  }
  if(T[u].r != NIL){
    h2 = getHeight(T[u].r)+1;
  }
    return H[u] = (h1>h2 ? h1:h2);
}

int getSibling(int u){
  if(T[u].p==NIL) return NIL;
  if(T[T[u].p].l!=u && T[T[u].p].l!=NIL) return T[T[u].p].l;
  if(T[T[u].p].r!=u && T[T[u].p].r!=NIL) return T[T[u].p].r;
}
  
  
void print(int u){
  int deg = 0;
  printf("node %d: parent = %d, sibling = %d, degree = %d, depth = %d, height = %d",u,T[u].p,getSibling(u),D[u]);

  if(T[u].l != NIL) deg++;
  if(T[u].r != NIL) deg++;
  
  if(T[u].p == NIL )      printf("root\n");
  else if( T[u].l == NIL ) printf("leaf\n");
  else                     printf("internal node\n");
}