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

void print(int );
int rec(int, int);

struct Node {

  int parent,left,right;

};

struct Node Nodedata[MAX];

int n; /*ノード総数*/
int D[MAX];

int main(){

  int i,j,d,v,c,l,r,sumnode;

  l = 0;

  scanf("%d",&n);

  sumnode = n;

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

    Nodedata[i].parent = NIL;
    Nodedata[i].left = NIL;
    Nodedata[i].right = NIL;

  }

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

    scanf("%d",&v); /*ノードID*/
    scanf("%d",&d); /*ノードデータ総数*/

    for(j = 0; j < d; j++){

      scanf("%d",&c); /*ノードデータ成分入力*/

      if(j == 0){ /*ノードデータの筆頭は左の成分*/

	Nodedata[v].left = c;

      }

      else{

	Nodedata[l].right = c;

      }

      l = c;

      Nodedata[c].parent = v;

    }

  }

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

    if(Nodedata[i].parent == NIL){

      r = i;
    }
  }
    rec(r,0);

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

      print(i);

    }

    return 0;
}

void print(int u){

  int i,c;

  printf("node %d: ",u);
  printf("parent = %d,",Nodedata[u].parent);
  printf(" depth = %d, ",D[u]);

  if(Nodedata[u].parent == NIL){

    printf("root,");

  }


  else if(Nodedata[u].left == NIL){

    printf("leaf,");

  }

  else{

    printf("internal node");

  }

  printf(" [");

  for(i = 0, c = Nodedata[u].left ; c != NIL ; i++,c= Nodedata[c].right){
 
    if(i) {

      printf(", ");

    }

    printf("%d",c);

  }

  printf("]\n");

}

int rec (int u, int p){

  D[u] = p;

  if(Nodedata[u].right != NIL){

    rec(Nodedata[u].right,p);

  }

  if(Nodedata[u].left != NIL){

    rec(Nodedata[u].left, p+1);

  }

}