#include <stdio.h>

int uf_table[50];

void uf_init(void) {
	int i;
	for(i=0;i<50;i++)uf_table[i]=0;
}

void uf_merge(int a,int b) {
	int next;
	while(uf_table[a]>0) {
		next=uf_table[a]-1;
		if(uf_table[next]>0)uf_table[a]=uf_table[next];
		a=next;
	}
	while(uf_table[b]>0) {
		next=uf_table[b]-1;
		if(uf_table[next]>0)uf_table[b]=uf_table[next];
		b=next;
	}
	if(a!=b)uf_table[b]=a+1;
}

int uf_issame(int a,int b) {
	int next;
	while(uf_table[a]>0) {
		next=uf_table[a]-1;
		if(uf_table[next]>0)uf_table[a]=uf_table[next];
		a=next;
	}
	while(uf_table[b]>0) {
		next=uf_table[b]-1;
		if(uf_table[next]>0)uf_table[b]=uf_table[next];
		b=next;
	}
	return a==b;
}

int main(void) {
	int n;
	int aki_num[30];
	int aki[30][50];
	int now_aki_num,now_aki;
	int i,j;
	int connected;
	while(1) {
		scanf("%d",&n);
		if(n==0)break;
		for(i=0;i<30;i++)aki_num[i]=0;
		for(i=0;i<n;i++) {
			scanf("%d",&now_aki_num);
			for(j=0;j<now_aki_num;j++) {
				scanf("%d",&now_aki);
				now_aki--;
				aki[now_aki][aki_num[now_aki]++]=i;
			}
		}
		connected=1;
		uf_init();
		for(i=0;i<30;i++) {
			for(j=1;j<aki_num[i];j++) {
				if(!uf_issame(aki[i][0],aki[i][j])) {
					uf_merge(aki[i][0],aki[i][j]);
					connected++;
				}
			}
			if(connected>=n)break;
		}
		printf("%d\n",i<30?i+1:-1);
	}
	return 0;
}