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

 struct node{
           int parent;
           int left;
           int right;
           };

 struct node T[MAX];

 int sibl(int u){
          if(T[u].parent==NIL)return NIL;
          
          if(T[T[u].parent].left!=u&&T[T[u].parent].left!=NIL)
                        return T[T[u].parent].left;
          if(T[T[u].parent].right!=u&&T[T[u].parent].right!=NIL)
                        return T[T[u].parent].right;
          return NIL;
          }

 int depth(int u){
          int d=0;
          int p=u;
          while(T[p].parent!=NIL){
                  p=T[p].parent;
                  d++;
                  }
          return d;
          }

 int height(int u){
          int n1=0,n2=0;
          if(T[u].left==NIL)return 0;
          if(T[u].left!=NIL){n1=height(T[u].left)+1;}
          if(T[u].right!=NIL){n2=height(T[u].right)+1;}
          if(n1>n2){return n1;}
          else {return n2;}
          }
  
 void print(int i){
         
         printf("node %d: parent = %d, ",i,T[i].parent);
         printf("sibling = %d, ",sibl(i));
         int dig=0;
         if(T[i].right!=NIL)dig++;
         if(T[i].left!=NIL)dig++;
         printf("degree = %d, ",dig);
         printf("depth = %d, ",depth(i));
         printf("height = %d, ",height(i));

         if(T[i].parent==NIL){printf("root\n");}
         else if(T[i].left==NIL&&T[i].right==NIL){printf("leaf\n");}
         else {printf("internal node\n");}
         }
      


 int main(){
         int i,n,k,v,l,r;
         scanf("%d",&n);
         for(i=0;i<n;i++){T[i].parent=NIL;}
         for(i=0;i<n;i++){
                   scanf("%d%d%d",&k,&l,&r);
                   T[k].left=l;
                   T[k].right=r;
                   if(l!=NIL)T[l].parent=k;
                   if(r!=NIL)T[r].parent=k;
                   
                   }
         
         for(i=0;i<n;i++){print(i);}
         return 0;
         }
