#include<iostream>
using namespace std;
#define NIL -1
#define MAX 25

struct Node{
    int p,lc,rc;
};

Node T[MAX];
int DEP[MAX],H[MAX];

int setH(int u){
    int hl=0,hr=0;
    if(T[u].lc!=NIL) hl=setH(T[u].lc)+1;
    if(T[u].rc!=NIL) hr=setH(T[u].rc)+1;
    return H[u]=max(hl,hr);
}

void setDEP(int u,int p){
    DEP[u]=p;
    if(T[u].lc!=NIL) setDEP(T[u].lc,p+1);
    if(T[u].rc!=NIL) setDEP(T[u].rc,p+1);
}

int setDeg(int u){
    int c=0;
    if(T[u].lc!=NIL) c++;
    if(T[u].rc!=NIL) c++;
    return c;
}

int getSibling(int u){
    if(T[u].p==NIL) return NIL;
    if(T[T[u].p].lc!=NIL&&T[T[u].p].lc!=u) return T[T[u].p].lc;
    if(T[T[u].p].rc!=NIL&&T[T[u].p].rc!=u) return T[T[u].p].rc;
    return NIL;
}

void print(int u){
    cout<<"node "<<u<<": ";
    cout<<"parent = "<<T[u].p<<", ";
    cout<<"sibling = "<<getSibling(u)<<", ";
    cout<<"degree = "<<setDeg(u)<<", ";
    cout<<"depth = "<<DEP[u]<<", ";
    cout<<"height = "<<H[u]<<", ";
    if(T[u].p==NIL) cout<<"root";
    else if(T[u].lc==NIL&&T[u].rc==NIL) cout<<"leaf";
    else cout<<"internal node";
    cout<<endl;
}

int main(){
    int n,v,l,r,root;
    cin>>n;
    for(int i=0;i<MAX;i++){
        T[i].p=T[i].lc=T[i].rc=NIL;
    }
    for(int i=0;i<n;i++){
        cin>>v>>l>>r;
        T[v].lc=l;
        T[v].rc=r;
        if(l!=NIL) T[l].p=v;
        if(r!=NIL) T[r].p=v;
    }

    for(int i=0;i<n;i++){
        if(T[i].p==NIL) root=i;
    }
    setH(root);
    setDEP(root,0);

    for(int i=0;i<n;i++) print(i);
}
