#include<stdio.h>
#define MAX 100000
typedef struct{//親、左の子供、右の兄弟 のid
  int p,l,r;
}Node;
Node N[MAX]; //本体
int S[MAX];//右の兄弟をつなぐために、一つ前の兄弟覚えてる必要がある.



void Scan(void){
  int id;
  int agree;
  int k;
  static int s=0;

  scanf("%d%d",&id,&agree);

  for(k=0;k<agree;k++,s++){
    scanf("%d",&S[s]);   //scan child
     
    if(k==0)N[id].l=S[s];     //初めの入力だけ、起動　つまり一番左の子供
  
    N[S[s]].p=id;//こども　とっては親
    if(k)N[S[s-1]].r = S[s];//子供同士　は右の　兄弟
  }
}

int Depth(int i){//深さ探索 id入力
  int count=0;
  Node X=N[i];

  for(;X.p!=-1;count++){
    X=N[X.p];
  }
  return count;
}

void Print(int i){
  int j;
  Node X=N[i];
  
  printf("node %d: ",i);
  printf("parent = %d, ",N[i].p);
  printf("depth = %d, ",Depth(i));

  if(N[i].p==-1){//N[i]はルート 親いない
    printf("root, [");
    if(X.l!=-1){
      printf("%d",X.l);
      
      X=N[X.l];
      for(j=0 ; X.r!=-1 ;){
	printf(", %d",X.r);
	X=N[X.r];
      }
    }
    printf("]");
  }
  else if(N[i].l==-1){//N[i]は子供なし 下に誰もいない
    printf("leaf, []");
  }
  else{//N[i]は子供あり　
    printf("internal node, [");

    if(X.l!=-1){
      printf("%d",X.l);

      X=N[X.l];
      
      for(j=0;X.r!=-1;){
	printf(", %d",X.r);
	  
	X=N[X.r];
      }
    }
    printf("]");
  }
  printf("\n");
}



int main(){
  int n;
  int i;
  
  scanf("%d",&n);

  for(i=0;i<MAX;i++){//INITIATE//　全部　-1
    N[i].p = N[i].l = N[i].r = -1;
  }
  
  for(i=0;i<n;i++)Scan();//INPUT n回

  for(i=0;i<n;i++){//OUTPUT
    Print(i);	
  }
  return 0;
}

