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<string>
#include<algorithm>
#include<map>
#include<set>
#include<utility>
#include<vector>
#include<cmath>
#include<cstdio>
#define loop(i,a,b) for(int i=a;i<b;i++) 
#define rep(i,a) loop(i,0,a)
#define pb push_back
#define mp make_pair
#define it ::iterator
#define all(in) in.begin(),in.end()
const double PI=acos(-1);
const double ESP=1e-10;
using namespace std;
int main(){
  int n;
  while(cin>>n,n){
    map<int,map<int,int> >in;
    rep(i,n){
      int m;cin>>m;
      rep(j,m){
	int tmp;cin>>tmp;
	in[i][tmp]=1;
      }
    }
    int ans=-2;
    int m;cin>>m;
    vector<int>out(m);
    rep(i,m)cin>>out[i];
    rep(i,n){
      bool han=true;
      rep(j,m)if(!in[i][out[j]]){han=false;break;}
      if(han){
	if(ans==-2)ans=i+1;
	else ans=-1;
      }
    }
    if(ans<0)ans=-1;
    cout<<ans<<endl;
  }
}

C++: // Save Your Privacy!

#include<iostream>
#include<vector>
#include<set>
using namespace std;
int main()
{
  int N,M,K,p,l;
  while(cin>>N,N){
    vector< set<int> >member(N);
    vector<int>suspect;
    for(int i=0;i<N;i++){
      cin>>M;
      for(int j=0;j<M;j++){
        cin>>p;
	member[i].insert(p-1);
      }
    }
    cin>>K;
    vector<int>leak(K);
    for(int i=0;i<K;i++){
      cin>>l;
      leak[i]=l-1;
    }

    for(int i=0;i<N;i++){
      bool ok=true;
      for(int j=0;j<leak.size();j++){
        if(member[i].find(leak[j])==member[i].end())ok=false;
      }
      if(ok)suspect.push_back(i);
    }

    if(suspect.size()==1)cout<<suspect[0]+1<<endl;
    else puts("-1");
  }
}

C++: #include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
typedef long long int ll;

int main(){
    int n;
    while(cin >> n,n){
        int res=-1;
        int cnt=0;
        vector<int> m(n);
        vector<int> v[n];
        for(int i=0;i<n;i++){
            cin >> m[i];
            for(int j=0;j<m[i];j++){
                int x; cin >> x;
                v[i].push_back(x);
            }
            sort(v[i].begin(),v[i].end());
        }
        int k; cin >> k;
        vector<int> vv(k);
        for(int i=0;i<k;i++){
            cin >> vv[i];
        }
        sort(vv.begin(), vv.end());
        for(int i=0;i<n;i++){
            int kk=0;
            for(int j=0;j<v[i].size();j++){
                if(vv[kk]==v[i][j]){
                    kk++;
                }
                if(kk==k)break;
            }
            if(kk==k){
                cnt++;
                res=i+1;
            }
        }
        if(cnt==1)printf("%d\n",res);
        else printf("-1\n");
    }
}

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

using namespace std;

int main() {
	int n;
	while (cin >> n, n) {

		vector<vector<int>>list(n, vector<int>(n, 0));
		int number;

		for (int i = 0;i < n;i++) {
			cin >> number;
			for (int j = 0;j < number;j++) {
				int codename;
				cin >> codename;
				list[i][codename - 1] = 1;
			}
		}//list[a][b]:a know b

		cin >> number;
		
		vector<int>ans(n,1);
		int leaked;
		for (int i = 0;i < number;i++) {
			cin >> leaked;
			for (int j = 0;j < n;j++) {
				if (list[j][leaked - 1] == 0) ans[j] = 0;
			}
		}//who is imposible
		int sum = 0,telltale;

		for (int i = 0;i < n;i++) {
			sum += ans[i];
			if (ans[i] == 1) telltale = i + 1;
		}

		if (sum == 1)cout << telltale << endl;
		else cout << -1 << endl;

	}
	return 0;
}

C++: #include<iostream>
#include<string>
#include<algorithm>
#include<cstring>
using namespace std;

typedef long long ll;

int main(){
	int n;
	ll p[100][2];
	while(cin>>n&&n){
		memset(p,0,sizeof(p));
		for(int i=0;i<n;i++){
			int m;
			cin>>m;
			for(int j=0;j<m;j++){
				int a;
				cin>>a;
				p[i][a/64] |= 1LL<<(a&63);
			}
		}
		int k;
		ll q[2]={0};
		cin>>k;
		for(int i=0;i<k;i++){
			int a;
			cin>>a;
			q[a/64] |= 1LL<<(a&63);
		}
		int ans=-1;
		for(int i=0;i<n;i++){
			if((p[i][0]&q[0])==q[0]&&(p[i][1]&q[1])==q[1]){
				if(ans==-1)ans=i+1;
				else{
					ans=-1;
					break;
				}
			}
		}
		cout<<ans<<endl;
	}
	return 0;
}

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

using namespace std;

#define NMAX 100
#define NO 0
#define YES 1

int main(){

	int N,M,Mi,K,li;
	int data[NMAX+1][NMAX+1];
	vector<int> ans,out;
	bool f;

	while(1){

		cin>>N;
		if(N==0) break;

		if(!ans.empty()) ans.clear();
		if(!out.empty()) out.clear();

		for(int i=0;i<=N;i++){
			for(int j=1;j<=N;j++){
				data[i][j]=NO;
			}
		}

		for(int i=1;i<=N;i++){
			cin>>M;
			for(int j=0;j<M;j++){
				cin>>Mi;
				data[i][Mi]=YES;
			}
		}

		cin>>K;

		for(int i=0;i<K;i++){
			cin>>li;
			out.push_back(li);
		}

		for(int i=1;i<=N;i++){
			f=true;
			for(int j=0;j<K;j++){
				if(data[i][out[j]]==NO) f=false;
			}
			if(f) ans.push_back(i);
		}

		if(ans.empty()||ans.size()>=2) cout<<"-1"<<endl;
		else cout<<ans[0]<<endl;

	}

}

C++: 		
		memset(know, 0, sizeof(know));
		memset(leak, 0, sizeof(leak));

		for(int i=0; i<n; ++i){
		
			cin>>m[i];
			
			for(int j=0; j<m[i]; ++j){
				
				int p;
				cin>>p;
				know[i][--p] = true;
			}
		}

		cin>>k;

		for(int i=0; i<k; ++i){
			
			int l;
			cin>>l;
			leak[--l]=true;
		}

		int spy = -1;
		
		for(int i=0; i<n; ++i){

			bool f = true;

			for(int j=0; j<n; ++j){
				
				if( m[i] < k || i != j && !know[i][j] && leak[j] ){
					f = false;
					break;
				}
			}

			if(f){
				if(spy==-1){
					spy = i;
				}
				else{
					spy = -2;
				}
			}
		}

		cout << (spy>=0?++spy:-1) << endl;
	}

	return 0;
}