#include<stdio.h>
typedef struct{
  int sa;//子の数
  int reach;
  int parent;
}node;

node B[99999];
int n;

/*int parent(int num){//parent input
  int i,j,r=-1;
  for(i=0;i<n;i++){
    for(j=0;j<B[i].sa;j++){
      if(num==B[i].A[j]){
	r=i;
	return r;
      }
    }
  }
  return r;
}
*/
int reach(int num){//reach input
  int i,r=0;
  for(i=0;i<n;i++){
    if(B[num].parent==-1)return r;
    else {
      num=B[num].parent;
      r++;
    }
  }
}



int main(){
  int i,j,k,a,f,h=0;

  scanf("%d",&n);
  for(i=0;i<n;i++){
    B[i].parent=-1;
  }
  for(i=0;i<n;i++){
    scanf("%d",&k);
    scanf("%d",&B[k].sa);
    for(j=0;j<B[k].sa;j++){
      scanf("%d",&a);
      B[a].parent=k;
    }
  }
  
  /*  for(i=0;i<n;i++){
    B[i].parent=parent(i);
  }
  */

  for(i=0;i<n;i++){
    B[i].reach=reach(i);
  }
  
  for(i=0;i<n;i++){
    printf("node %d: parent = %d, depth = %d, ",i,B[i].parent,B[i].reach);
    if(B[i].sa==0)printf("leaf, ");
    else if(B[i].parent==-1)printf("root, ");
    else printf("internal node, ");
        printf("[");
    for(j=1;j<n;j++){
      if(i==B[j].parent){
	if(f==0){
	  printf("%d",j);
	  f=1;
	}
	else printf(", %d",j);
      }
    }
    f=0;
    if(i==B[0].parent) printf(", 0");
    printf("]\n");
    
  }
  return 0;
}