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

struct Node {
    int parent;
    int left,right;
};

struct Node T[MAX];
int n, D[MAX];



void print(int u){
    int i,c;
    printf("node %d: ",u);
    printf("parent = %d, ",T[u].parent);
    printf("depth = %d, ",D[u]);
    
    
    if(T[u].parent == NIL) printf("root, ");
    else if(T[u].left == NIL) printf("leaf, ");
    else   printf("internal node, ");
    
    printf("[");
    for(i=0, c=T[u].left; c!=NIL; i++, c=T[c].right){
        if(i) printf(", ");
        printf("%d",c);
    }
    printf("]\n");
}
// 再帰的に深さを求める
void rec(int u, int p){
    D[u]=p;
    if(T[u].right !=NIL) rec(T[u].right, p); // 右の兄弟に同じ深さを設定
    if(T[u].left!=NIL) rec(T[u].left, p+1); // 最も左の子に自分の深さ+1を設定
}

int main(){
    int i,v,l,c,d,r;
    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",&v,&d);
    
    for(int j=0; j<d; j++){
        scanf("%d",&c);
        if(j==0) T[v].left=c;
        else T[l].right=c;
        l=c;
        T[c].parent = v;
    }
    }
    for(i=0;i<n;i++){
        
        if(T[i].parent == NIL) r=i;
    }
    rec(r,0);
   
    
   for(int i=0; i<n; i++) print(i);
    return 0;
}
