/*
AizuOnline A2011
Gather the Maps!
*/
#include <stdio.h>

int sked[50][30];
int ok_days[50];
int flag[50];
int N;

void init()
{
  int i,j;
  for(i=0;i<50;i++)
    {
      ok_days[i]=0;
      flag[i]=0;
      for(j=0;j<30;j++)
	sked[i][j]=0;
    }
}
print()
{
  int i,j;

  for(i=0;i<N;i++)
    {
      printf("%d ",ok_days[i]);
      for(j=0;j<ok_days[i];j++)
	printf("%d ",sked[i][j]);
      printf("(%d)",flag[i]);
      printf("\n");
    }
}

void update_meet(int md,int nd)
{
  int i;

  for(i=0;i<N;i++)
    if(flag[i]==md)
      flag[i]=nd;
}

void can_meet(int d1)
{
  int i,j;
  //printf("CM: %d \n",d1);

  for(i=0;i<N;i++)
    for(j=0;j<ok_days[i];j++)
      {
	//printf("SK%d\n",sked[i][j]);
	if(sked[i][j] == d1)
	  {
	    if(flag[i] == 0)
	      flag[i] = d1;
	    else if(flag[i] < d1)
	      update_meet(flag[i],d1);
	  }
      }
}




int all_meet(int d)
{
  int i;
  for(i=0;i<N;i++)
    if(flag[i]!=d)
      return(0);
  return(1);
}
int chk_zero_day()
{
  int i;
  for(i=0;i<N;i++)
    if(ok_days[i]==0)
      return(-1);
  return(0);
} 
main()
{
  int i,j,d;
  while(EOF != scanf("%d",&N) && N)
    {
      init();
      for(i=0;i<N;i++)
	{
	  scanf("%d",&(ok_days[i]));
	  for(j=0;j<ok_days[i];j++)
	    scanf("%d",&(sked[i][j]));
	}
      if(chk_zero_day())
	goto EMPTY;
      for(d=1;d<=30;d++)
	{
	  can_meet(d);
	  
	  if(all_meet(d))
	    { // printf("ALL MEET\n");
	      printf("%d\n",d);
	      goto NEXT;
	    }
	}
    EMPTY:
      printf("%d\n",-1);
    NEXT: ;
    }
return(0);
}