#include<stdio.h>
#define MAX 100000
#define NIL -1
typedef struct{
  int p;
  int l;
  int r;
}Node;

Node T[MAX];
int n,D[MAX];//深さを代入

void print(int node_num){
    int i,c,flag=1;
    printf("node %d: ",node_num);//引数の番号
    printf("parent = %d, ",T[node_num].p);//引数ノードの親
    printf("depth = %d, ",D[node_num]);//引数ノードからrootまでの深さ
    if(T[node_num].p==(-1)) printf("root, ");
    else if(T[node_num].l==NIL) printf("leaf, ");//lに子の一番左のノードを入れる
    else printf("internal node, ");
    printf("[");
    for(c=T[node_num].l;c!=NIL;flag++){
        printf("%d",c);
        c=T[c].r;
        if(c!=NIL){
          printf(", ");
        }
      }
      printf("]");
      printf("\n");
}
//深さ探索(再起)
int rec(int node_num,int p){
  D[node_num]=p;//初期pは0値を逐一更新
  //初期化時全てのノードのp,r,lはNILになってる
  if(T[node_num].r!=NIL)rec(T[node_num].r,p);//最深部を探すため兄弟のノードからも子がないか調べる.
  if(T[node_num].l!=NIL)rec(T[node_num].l,p+1);//子のノードがあればpをカウントしてnode_numを子に変更
}

int main(){
  int i,j,depth,left,right,child,d,node_num;//dは次数
  scanf("%d",&n);
    for(i=0;i<n;i++){
      T[i].l=T[i].r=T[i].p=NIL;
    }
    for(i=0;i<n;i++){//ノードの個数
      scanf("%d",&node_num);
      scanf("%d",&d);//次数＝子の数
      for(j=0;j<d;j++){  //子入力
        scanf("%d",&child);
        if(j==0) T[node_num].l=child;//一回めに左端の子を代入
        else T[left].r=child;//以降の子は兄弟なのでrに代入
        left=child;//leftにchildのノードを入れておく
        T[child].p=node_num;//入れたノードの親を設定
   //ここまで子の入力
  }
}
    for(i=0;i<n;i++){
      if(T[i].p==NIL)right=i;
    }
    rec(right,0);
for(i=0;i<n;i++) print(i);
return 0;
}

