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

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

int getDepth(struct Node *,int);

int main(){
    int n,m;
    int id,c,tmp;
    int depth[MAX];

    struct Node TREE[MAX];

    scanf("%d",&n);
    for(int i = 0;i < n;i++){
        TREE[i].parent = TREE[i].left = TREE[i].right = NIL;
    }

    for(int i = 0;i < n;i++){
        scanf("%d%d",&id,&m);
        for(int j = 0;j < m;j++){
            scanf("%d",&c);
            //j == 0の時は、子供ではなく親となるノードなので
            if(j == 0){
                //子供のid
                TREE[id].left = c;
                //子供たちの親
                TREE[c].parent = id;
                tmp = c;
            }
            else{
                //子供たちのidのノードを設定
                TREE[tmp].right = c;
                TREE[c].parent = id;
                tmp = c;
            }
        }
    }
    for(int i = 0;i < n;i++){
        depth[i] = getDepth(TREE,i);
    }

    for(int i = 0; i < n; i++){
        printf("node %d: parent = %d, depth = %d, ", i, TREE[i].parent, depth[i]);
        //親がいなかったら
        if(TREE[i].parent == NIL){
            printf("root");
        }
        // 子供がいなかったら
        else if(TREE[i].left == NIL){
            printf("leaf");
        }
        // どちらでもない時
        else{
            printf("internal node");
        }
        printf(", [");
        //子供がいなくなるまで
        if(TREE[i].left != NIL){
            printf("%d",TREE[i].left);
            tmp = TREE[i].left;
            while(1){
                if(TREE[tmp].right == NIL) break;
                printf(", %d", TREE[tmp].right);
                tmp = TREE[tmp].right;
            }
        }
        printf("]\n");
    }

    return 0;
}

int getDepth(struct Node *TREE,int i){
    if(TREE[i].parent == NIL)return 0;
    return getDepth(TREE,TREE[i].parent) + 1;
}
