#include<stdio.h>
#include<stdlib.h>
#define mymalloc(p,n) {p = malloc((n)*sizeof(*p));if ((p)==NULL) {printf("not enough memory?\n"); exit(1);};}

typedef struct node{
	struct node *parent;
	struct node **child;
	struct node *next;
	int id;
	int depth;
	int nchild;
}node;

node *createNode(){
	node *v;
	mymalloc(v,1);
	v->parent=NULL;
	v->nchild=0;
	return v;
}

int readTree(node **T){
	int i,j,id,nchild,k,n;
	node *child;
	scanf("%d",&n);
	mymalloc(*T,n);
	for(i=0;i<n;i++){
		T[i]=createNode();
	}
	for(i=0;i<n;i++){
		scanf(" %d %d",&id,&nchild);
		T[id]->id=id;
		T[id]->nchild=nchild;
		if(nchild==0){continue;}
		mymalloc(T[id]->child,nchild);
		for(j=0;j<nchild;j++){
			scanf(" %d",&k);
			T[id]->child[j]=T[k];
			T[k]->parent=T[id];
		}
	}
	return n;
}

node *findRoot(node **T,int n){
	int i;
	for(i=0;i<n;i++){
		if(T[i]->parent==NULL){
			return T[i];
		}
	}
	return NULL;
}

void calcDepth(node *T,int depth){
	int i;
	if(T!=NULL){
		T->depth=depth;
		for(i=0;i<T->nchild;i++){
			calcDepth(T->child[i],depth+1);
		}
	}
}

void printNode(node *T){
	int i;
	node *child;
	printf("node %d: ",T->id);
	if(T->parent==NULL){
		printf("parent = -1, ");
	}else{
		printf("parent = %d, ",T->parent->id);
	}
	printf("depth = %d, ",T->depth);
	if(T->nchild==0&&T->parent!=NULL){
		printf("leaf, []\n");
	}else{
		if(T->parent==NULL){
			printf("root, ");
		}else{
			printf("internal node, ");
		}
		printf("[");
		for(i=0;i<T->nchild;i++){
			printf("%d",T->child[i]->id);
			if(i!=T->nchild-1){
				printf(", ");
			}
		}
		printf("]\n");
	}
}

void printAll(node *root){
	int i;
	printNode(root);
	for(i=0;i<root->nchild;i++){
		printNode(root->child[i]);
	}
}

main(){
	node **T;
	node *root;
	int n;
	int i;
	n=readTree(T);
	root=findRoot(T,n);
	calcDepth(root,0);
	for(i=0;i<n;i++){
		printNode(T[i]);
	}
	return 0;
}