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

struct Node{

  int parent;
  int left;
  int right;
};
struct Node t[MAX];
int Depth[MAX];
int n;

void getDepth(int, int);
void printType(int);

int main(){

  int i, d, vec, l=0,  j, r, chi;

  scanf("%d", &n);

  for(i=0; i<n; i++) t[i].parent=t[i].left=t[i].right=NIL;//必要?

  for(i=0; i<n; i++){
    scanf("%d %d", &vec, &d);
    
    for(j=0; j<d; j++){
      scanf("%d", &chi);
      
      if(j==0) t[vec].left=chi;
      else t[l].right=chi; //d!=0
      
      l=chi;
      t[chi].parent=vec;
    }

  }  
  for(i=0; i<n; i++){
    if(t[i].parent==NIL) r=i;
  }
  
  getDepth(r, 0); //error

  for(i=0; i<n; i++){

    printf("node %d: ", i);
    printf("parent = %d, ", t[i].parent); // printParent(i);
    printf("depth = %d, ", Depth[i]);  //printDepth(i);
    printType(i);
  }

  return 0;
}

void getDepth(int x, int p){ //節点xの深さ。親をたどり、根までの長さ

  Depth[x]=p;
  if(t[x].right!=NIL){
    getDepth(t[x].right, p);
  }
  if(t[x].left!=NIL){
    getDepth(t[x].left, p+1);
  }
}
void printType(int i){
  
  int j, child;

  if(t[i].parent==NIL){
    printf("root, ");
    printf("[");
    for(j=0, child=t[i].left; child!=NIL; j++, child=t[child].right){
      if(j) printf(", ");
      printf("%d", child);
    }
    printf("]\n");
  }
  else if(t[i].left==NIL)printf("leaf, []\n");

  else{
    printf("internal node, ");
    printf("[");
    for(j=0, child=t[i].left; child!=NIL; j++, child=t[child].right){
      if(j) printf(", ");
      printf("%d", child);
    }
    printf("]\n");
  }
}

