#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define ROOT 0
#define INTERNAL 1
#define LEAF 2

typedef struct{
  int id;//ノードID
  int p;//ノードの親のID
  int d;//ノードの深さ
  char kind[13];//ノードの種類
  int *c;//ノードの子供のID
}node;

int main() {
  node *t;
  int i,j;
  int n;//要素数
  int k;//その要素の次数

  //全体の要素数の入力
  scanf("%d",&n);
  //printf("How many node: %d\n",n);
  t = (node*)malloc(sizeof(node) * n);
  //ID[i]のノードの情報を入力
  for(i=0; i<n; i++){
    //printf("In ID: ");
    scanf("%d",&t[i].id );//ID入力
    t[i].d = 0;
    //printf("In k: " );
    scanf("%d",&k);//次数入力
    //ノードの種類の決定
    if (i==0) {
      strcpy(t[i].kind,"root");
    }else if(k==0){
      strcpy(t[i].kind,"leaf");
    }else{
      strcpy(t[i].kind,"internal node");
    }
    if(k!=0){
      t[i].c = (int*)malloc(sizeof(int) * k);//次数の数だけこどものIDを格納する変数を確保
      //次数の数だけ子供のIDを入力
      for (j = 0; j < k; j++) {
        scanf("%d",&t[i].c[j]);
        if(i==0){//親の決定
          t[i].p = -1;
        }else{
          t[t[i].c[j]].p = t[i].id;//子供の親のIDの決定
        }
      }
    }
    //階層の決定
    if (i==0) {
      t[i].d = 0;
    }else{
      t[i].d = t[t[i].p].d+1;
    }
    //printf("t[%d].p= %d\n",i,t[i].p);
    //printf("t[t[%d].p].d= %d\n",i,t[t[i].p].d );
    printf("node %d: parent = %d, depth = %d, %s, [",t[i].id,t[i].p,t[i].d,t[i].kind);
    if(k!=0){
      for(j=0; j<k; j++){
        printf("%d",t[i].c[j] );
        if (j!=k-1) {
          printf(" ");
        }
      }
    }
    printf("]\n");
  }
  return 0;
}

