#include<stdio.h>

#define MAX 100005
#define NIL -1

typedef struct
{
  int parent;
  int left; //左の子
  int right; //右の兄弟
}node;

node T[MAX];
int D[MAX];

void print(int u)
{
  int i,c;

  printf("node %d: parent = %d, depth = %d, ",u,T[u].parent,D[u]);

  if(T[u].parent == NIL) printf("root, ");
  else if(T[u].left == NIL) printf("leaf, ");
  else printf("internal node, ");

  printf("[");
  for(i = 0,c = T[u].left ; c != NIL ; i++,c = T[c].right)
    {
      if(i) printf(", ");
      printf("%d",c);
    }
  printf("]\n");

  return;
}

void depth(int u,int p)
{
  D[u] = p;

  if(T[u].right != NIL) depth(T[u].right,p);
  if(T[u].left != NIL) depth(T[u].left,p+1);

  return;
}

int main()
{
  int i,j,k,n,id,sib,child,root=NIL;

  scanf("%d",&n);

  for(i = 0 ; i < n ; i++) //データの初期化
    {
      T[i].parent = NIL;
      T[i].left = NIL;
      T[i].right = NIL;
    }

  for(i = 0 ; i < n ; i++)
    {
      scanf("%d %d",&id,&k);

      for(j = 0,sib = NIL ; j < k ; j++)
	{
	  scanf("%d",&child);
	  T[child].parent = id;
	  if(j == 0) T[id].left = child; //一番左
	  else T[sib].right = child; //左の兄弟と繋ぐ

	  sib = child; //次の子の左の兄弟
	}
    }

  for(i = 0 ; i < n ; i++) //root の探索 (初期化した値)
    {
      if(T[i].parent == -1) root = i;
    }

  depth(root,0); //depth

  for(i = 0 ; i < n ; i++) //表示
    {
      print(i);
    }
    
  return 0;
}

