#include <stdio.h>

#define MAX 100005
#define NIL -1
// 親名と子の一番左と自分と同じ高さの右のデータ
typedef struct {int p, l, r;} Node;

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

void print(int u) {
    int i,c;
    // ノード番号出力
    printf("node %d: ",u);
    // 親番号の出力
    printf("parent = %d, ",T[u].p);
    // 自分の深さ出力
    printf("depth = %d, ",D[u]);

    // もし親がいなかったら根になる
    if( T[u].p == NIL ) printf("root, ");
    // もし子がいなかったら葉になる
    else if( T[u].l == NIL ) printf("leaf, ");
    // 上の二つに合わなかったら節点になる
    else printf("internal node, ");

    printf("[");
    // .lから順番に右に行くことで子を全部出力することができる
    for(i=0, c=T[u].l; c != NIL; i++, c=T[c].r) {
        if(i) printf(", ");
        printf("%d",c);
    }
    printf("]\n");
}

void rec(int u, int p) {
    // 各ノードの深さを記憶する
    D[u] = p;
    // 右側にノードがあったらそっちに行く
    if(T[u].r != NIL) rec(T[u].r,p);
    // 子がいたらそっちに行く
    if(T[u].l != NIL) rec(T[u].l,p+1);
}

int main(void) {
    int i,j,d,v,c,l,r;
    // ノードが何個あるか取得
    scanf("%d",&n);
    // ノードの個数分のデータ用意
    for(i=0;i<n;i++) T[i].p = T[i].l = T[i].r = NIL;
    for(i=0;i<n;i++) {
        // 親データと何個の子データがあるか取得
        scanf("%d %d",&v,&d);
        for(j=0;j<d;j++) {
            // 子データを取得する
            scanf("%d",&c);
            // 一個目は必ず左のデータになる
            if(j==0) T[v].l=c;
            // 二個目以降は必ず前回のデータの右データになる
            else T[l].r =c;
            // 次のデータのために記憶
            l = c;
            // 親データを入力
            T[c].p = v;
        }
    }
    for(i=0;i<n;i++) {
        // 親データがなかった場合そこが根となるため番号を記憶
        if(T[i].p == NIL) r = i;
    }
    // 再起関数にぶち込む
    rec(r,0);
    // 出力
    for(i=0;i<n;i++) print(i);

    return 0;
}
