#include <stdio.h>

typedef struct {
  int P;
  int C; 
  int B;
}tree;

int main()
{
  int n,i,j,id,k,kodomo,irekae,depth;

  scanf("%d",&n);

  tree T[n];

  /*入力編*/

  for(i=0;i<n;i++)
    {
      T[i].P=-1;
    }
  
  for(i=0;i<n;i++)
    {
      scanf("%d%d",&id,&k);/*idとkの入力*/
      
      if(k!=0)/*子供がいる場合*/
	{
	  scanf("%d",&T[id].C);

	  kodomo=T[id].C;
      
	  for(j=0;j<k;j++)
	    {
	      if(j==k-1)T[kodomo].B=-1;/*最右の子は兄弟rootを-1にする。*/
	      else scanf("%d",&T[kodomo].B);/*子の兄弟の一人を代入（ひとりいれて次々連結していく）*/
	      
	      T[kodomo].P=id;/*親代入*/
	      
	      irekae=kodomo;
	      kodomo=T[irekae].B;/*kodomoを次の子供の番号に入れ替える*/
	    }
	}
      else
	{
	  T[id].C=-1;
	}

      
    }

  /*出力編*/

  for(i=0;i<n;i++)
    {

      printf("node %d: ",i);/*ノード番号出力*/
 
      printf("parent = %d, ",T[i].P);/*親出力*/
      
      depth=0;
      id=i;
      
      while(1)
	{
	  if(T[id].P==-1)break;
	  
	  depth++;
	  
	  irekae=id;
	  id=T[irekae].P;
	}

      printf("depth = %d, ",depth);/*深さ出力*/

      if(T[i].P==-1)
	{
	  printf("root, [");

	  if(T[i].C==-1)
	    {
	      printf("]\n");
	    }
	  else
	    {
	      id=T[i].C;
	      while(1)
		{
		  if(T[id].B==-1)
		    {
		      printf("%d]\n",id);
		      break;
		    }
		  else
		    {
		      printf("%d, ",id);
		      irekae=T[id].B;
		      id=irekae;
		    }
		}
	    }
	}
      else if(T[i].C==-1)
	{
	  printf("leaf, []\n");
	}
      else
	{
	  printf("internal node, [");
	  
	  id=T[i].C;
	  while(1)
	    {
	      if(T[id].B==-1)
		{
		  printf("%d]\n",id);
		  break;
		}
	      else
		{
		  printf("%d, ",id);
		  irekae=T[id].B;
		  id=irekae;
		}
	    }
	}
    }
  
  return 0;
}

