#include<stdio.h>
#include<stdlib.h>

typedef struct box{
	int par;//親の接点番号
	int sunnumber;//子の数
	int *sun;//子のリスト
} Node;

int depthsearch(Node *node,int point)//深さを返す
{
	int i,cnt=0,current = point;
	while(node[current].par!=-1){
		current=node[current].par;
		cnt++;
	}
	
	return cnt;
}

int main(void)
{
	int i,j,n;
	int box,s;
	Node *node;
	
	scanf("%d",&n);
	node=(Node*)malloc(sizeof(Node)*n);
	for(i=0;i<n;i++) node[i].par=-1;//親の節点番号を初期化
	for(i=0;i<n;i++){
		scanf("%d",&box);
		scanf("%d",&node[box].sunnumber);
		node[box].sun=(int*)malloc(sizeof(int)*node[box].sunnumber);//子リストの格納領域を確保
		for(j=0;j<node[box].sunnumber;j++){
			scanf("%d",&node[box].sun[j]);
			node[node[box].sun[j]].par=box;//親ノードを指定
		}
	}
	
	for(i=0;i<n;i++){
		printf("node %d: parent = %d, depth = %d, ",i,node[i].par,depthsearch(node,i));
		if(node[i].par==-1) printf("root, [");
		else if(node[i].sunnumber==0) printf("leaf, [");
		else printf("internal node, [");
		for(j=0;j<node[i].sunnumber;j++){
			if(j!=0) printf(", ");
			printf("%d",node[i].sun[j]);
		}
		printf("]\n");
	}
	
	for(i=0;i<n;i++){
		free(node[i].sun);
	}
	free(node);
	
	return 0;
}
