Go: package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
	"strings"
)

func main() {
	io := NewIo()
	defer io.Flush()

	for {
		N := io.NextInt()
		if N == 0 {
			break
		}
		set := make([]map[int]struct{}, N)
		for i := 0; i < N; i++ {
			set[i] = make(map[int]struct{})
			M := io.NextInt()
			for j := 0; j < M; j++ {
				p := io.NextInt()
				set[i][p] = struct{}{}
			}
		}
		K := io.NextInt()
		l := make([]int, K)
		for i := 0; i < K; i++ {
			l[i] = io.NextInt()
		}

		ans := 0
	FOR_OUTER:
		for i := 0; i < N; i++ {
			for j := 0; j < K; j++ {
				if _, f := set[i][l[j]]; f == false {
					continue FOR_OUTER
				}
			}
			switch ans {
			case 0:
				ans = i + 1
			default:
				ans = -1
			}
		}
		if ans > 0 {
			io.Println(ans)
		} else {
			io.Println(-1)
		}
	}
}

// I/O template
type Io struct {
	reader    *bufio.Reader
	writer    *bufio.Writer
	tokens    []string
	nextToken int
}

func NewIo() *Io {
	return &Io{
		reader: bufio.NewReader(os.Stdin),
		writer: bufio.NewWriter(os.Stdout),
	}
}

func (io *Io) Flush() {
	err := io.writer.Flush()
	if err != nil {
		panic(err)
	}
}

func (io *Io) NextLine() string {
	var buff []byte
	for {
		line, isPrefix, err := io.reader.ReadLine()
		if err != nil {
			panic(err)
		}
		buff = append(buff, line...)
		if !isPrefix {
			break
		}
	}
	return string(buff)
}

func (io *Io) Next() string {
	for io.nextToken >= len(io.tokens) {
		line := io.NextLine()
		io.tokens = strings.Fields(line)
		io.nextToken = 0
	}
	s := io.tokens[io.nextToken]
	io.nextToken++
	return s
}

func (io *Io) NextInt() int {
	i, err := strconv.Atoi(io.Next())
	if err != nil {
		panic(err)
	}
	return i
}

func (io *Io) NextFloat() float64 {
	i, err := strconv.ParseFloat(io.Next(), 64)
	if err != nil {
		panic(err)
	}
	return i
}

func (io *Io) Println(a ...interface{}) {
	fmt.Fprintln(io.writer, a...)
}

func (io *Io) Printf(format string, a ...interface{}) {
	fmt.Fprintf(io.writer, format, a...)
}

func (io *Io) PrintIntSlice(a []int) {
	b := []interface{}{}
	for _, x := range a {
		b = append(b, x)
	}
	io.Println(b...)
}

func (io *Io) PrintStringSlice(a []string) {
	b := []interface{}{}
	for _, x := range a {
		b = append(b, x)
	}
	io.Println(b...)
}

func Log(name string, value interface{}) {
	fmt.Fprintf(os.Stderr, "%s=%+v\n", name, value)
}

func ExampleIo() {
	io := NewIo()
	defer io.Flush()
	a := make([]int, 0, 3)
	a[0], a[1], a[2] = io.NextInt(), io.NextInt(), io.NextInt()
	io.Println(a)
	io.PrintIntSlice(a)
	Log("io", a)
}

C++: #include <iostream>
#include <vector>
#include <map>

using namespace std;

vector<map<int,int>> known;
vector<int> leak;

int main(){
	int n;
	while(cin>>n, n){
		//M
		for(int i=0;i<n;i++){
			known.push_back(map<int,int>());
			int nknow;
			cin >> nknow;
			for(int j=0;j<nknow;j++){
				int tmp;
				cin >> tmp;
				known[i].insert(make_pair(tmp,j));
			}
		}
		//K
		int k;
		cin >> k;
		leak = vector<int>(k);
		for(int ik=0;ik<k;ik++){
			int tmp;
			cin >> tmp;
			leak[ik] = tmp;
		}

		//??¢?´¢
		int flag = 1;
		int targ = -2;
		for(int i=0;i<n;i++){
			for(int num: leak){
				auto it = known[i].find(num);
				if(it == known[i].end()){
					flag = 0;
					break;
				}else{
					//cout << it->second << endl;
				}
			}
			if(targ == -2 && flag == 1){
				targ = i;
			}
			else if(targ != -2 && flag == 1){
				targ = -1;
				break;
			}
			flag = 1;
		}
		if(targ == -2) targ = -1;
		cout << targ+1 << endl;
		known.clear();
		leak.clear();
	}

	return 0;
}

C++: #include<iostream>
#include<cstdio>
#include<vector>
#include<string>
#include<functional>
#include<queue>
#include<algorithm>
#include<complex>
#include<cstdlib>
#include<cctype>

#define REP(i,n) for(int i = 0;i < (n);i++)
#define PB push_back
#define MP make_pair
#define FI first
#define SE second
#define SHOW1d(v,n) {for(int i = 0;i < (n);i++)cout << v[i] << ' ';cout << endl << endl;}
#define SHOW2d(v,i,j) {for(int a = 0;a < i;a++){for(int b = 0;b < j;b++)cout << v[a][b] << ' ';cout << endl;}cout << endl;}
#define ALL(v) v.begin(),v.end()

using namespace std;

typedef long long ll;
typedef vector<int> iv;
typedef vector<iv> iiv;
typedef vector<string> sv;

int main()
{
	int n;
	
	while(cin >> n,n)
	{
		iiv v;
		iv ans;
		REP(i,n)
		{
			iv vtmp;
			int m;
			cin >> m;
			REP(j,m)
			{
				int tt;
				cin >> tt;
				vtmp.PB(tt);
				
			}
			v.PB(vtmp);
		}
		
		int k;
		cin >> k;
		
		iv _list;
		REP(i,k)
		{
			int tmp;
			cin >> tmp;
			_list.PB(tmp);
		}
		
		REP(i,n)
		{
			bool flag = true;
			REP(j,k)
			{
				if(find(ALL(v[i]),_list[j]) == v[i].end())
				{
					flag = false;
					break;
				}
			}
			if(flag)
			{
				ans.PB(i+1);
			}
		}
		
		if(ans.size() == 1)
		{
			cout << ans[0] << endl;
		}
		else
		{
			cout << -1 << endl;
		}
		
	}
		
	
	return 0;
}

C++: #include <bits/stdc++.h>
#define r(i,n) for(int i=0;i<n;i++)
using namespace std;
int main(){
  int n;
  while(cin>>n,n){
    int a[n+2][n+2]={0},m;
    r(i,n+1){
      cin>>m;
      r(j,m)cin>>a[i][j];
      sort(a[i],a[i]+m);
    }
    int c=0,p,x=0,u,ans=0;
    r(i,n){p=0;
      for(int j=0;a[i][j]!=0&&101>a[i][j];j++){
        if(a[i][j]==a[n][p])p++;
      }
      if(p==m){
        x++;
        ans=i;
      }
    }
    if(x==1)cout<<ans+1<<endl;
    else cout<<-1<<endl;
  }
}

C++: #include<bits/stdc++.h>
using namespace std;

int main() {
	int a;
	while (cin >> a, a) {
		vector<int>V[100]{};
		bool hannin[100];
		memset(hannin,true, a);
		for (int b = 0; b < a; b++) {
			int c;
			cin >> c;
			for (int d = 0; d < c; d++) {
				int e;
				cin >> e;
				e--;
				V[e].push_back(b);
			}
		}
		int x;
		cin >> x;
		for (int y = 0; y < x; y++) {
			int z;
			cin >> z;
			z--;
			for (int i = 0,sum=0; i < a; i++) {
				if (sum < V[z].size() && V[z][sum] == i)sum++;
				else hannin[i] = false;
			}
		}
		int s = 0, l = 0;
		for (int k = 0; k < a; k++) {
			if (hannin[k]) { s++; l = k + 1; }
		}
		if (s == 1)cout << l << endl;
		else puts("-1");
	}
}

C++: #include<cstdio>
#include<iostream>
#include<vector>
#include<algorithm>
#include<functional>
#define all(X) X.begin(),X.end()
#define rep(X,Y) for(int X=0;(X)<(Y);++(X))

using namespace std;

typedef vector<vector<int>> vvi;

int main(){
  int n;
  while(cin>>n,n){
    vvi v(n);
    int m;
    rep(i,n){
      cin>>m;
      v[i].resize(m);
      rep(j,m)
	cin>>v[i][j];
    }
    cin>>m;
    vector<int> l(m);
    rep(i,m){
      cin>>l[i];
    }
    vector<int> re(n,1);
    rep(i,m){
      rep(j,n){
	int f=0;
	for(int a:v[j])
	  if(a==l[i]) f=1;
	if(!f) re[j]=0;
      }
    }
    int sum=accumulate(all(re),0);
    if(sum==1){
      rep(i,n)
	if(re[i])
	  cout<<i+1<<endl;
    }else{
      cout<<-1<<endl;
    }
  }
}

C++: #include <bits/stdc++.h>
using namespace std;

vector<pair<int, int> > v;
int arr[101][101];
int brr[101];
int crr[101];

int main(){
while(1){//start

	//init
	for(int i = 0; i < 101; i++){
		for(int j = 0; j < 101; j++){
			arr[i][j] = 0;
			brr[i] = 0;
			crr[i] = 0;
		}
	}
	v.clear();


	int n;
	cin >> n;
	if(n == 0) break;
	for(int i = 1; i <= n; i++){
		int m;
		cin >> m;
		for(int j = 0; j < m; j++){
			int temp;
			cin >> temp;
			arr[i][temp] = 1;
		}
	}

	int k;
	cin >> k;
	for(int i = 0; i < k; i++){
		int temp;
		cin >> temp;
		brr[temp] = 1;
		crr[temp] = 1;
	}


	for(int i = 1; i <= n; i++){
		int point = 0;
		for(int j = 1; j <= 100; j++){
			if(arr[i][j] and brr[j]){
				point++;
				crr[j] = 0;
			}
		}
		v.push_back(make_pair(point, i));
	}

	sort(v.begin(), v.end());
	reverse(v.begin(), v.end());
	bool flag = false;
	for(int i = 0; i < 101; i++){
		if(crr[i]) flag = true;
	}

	if(flag) cout << -1 << endl;
	else if(v[0].first == v[1].first) cout << -1 << endl;
	else cout << v[0].second << endl;
}//end


	return 0;
}