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 <bits/stdc++.h>
using namespace std;

vector<pair<int, int> > v;
int arr[101][101];
int brr[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;
		}
	}
	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;
	}

	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++;
		}
		v.push_back(make_pair(point, i));
	}

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


	return 0;
}

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

using namespace std;

int main() {
  int n;
  while(cin>>n && n!=0) {
    vector<vector<int> > manInfo;
    for(int i=0; i<n; i++) {
      int m;
      cin>>m;
      //cout<<m<<"! ";
      vector<int> tmpVec;
      for(int j=0; j<m; j++) {
	int tmp;
	cin>>tmp;
	tmpVec.push_back(--tmp);
	//cout<<tmpVec.size()<<" ";
      }
      //cout<<endl;
      //cout<<"size-"<<tmpVec.size()<<endl;
      manInfo.push_back(tmpVec);
    }

    // print
    /*
    for(int i=0; i<manInfo.size(); i++) {
      for(int j=0; j<manInfo[i].size(); j++) {
	cout<<manInfo[i][j]<<" ";
      }
      cout<<endl;
    }
    */

    int k;
    cin>>k;
    vector<int> outList;
    //cout<<"outlist ";    
    for(int l=0; l<k; l++) {
      int tmp;
      cin>>tmp;
      outList.push_back(--tmp);
    }
    //cout<<endl;
    int ans = -2;
    for(int j=0; j<manInfo.size(); j++) {
      bool outFlag = true;
      for(int k=0; k<outList.size() && outFlag==true; k++) {
	bool flag = true;
	if(manInfo[j].empty()) {
	  outFlag = false;
	}
	for(int l=0; l<manInfo[j].size() && flag==true; l++) {
	  //cout<<outList[k]<<" in "<<manInfo[j][l]<<endl;
	  if(outList[k] == manInfo[j][l]) {
	    //cout<<"out"<<endl;
	    flag = false;
	  }
	  if(l==manInfo[j].size()-1 && flag==true) {
	    outFlag = false;
	    //cout<<j<<"doesn')t have "<<k<<endl;
	  }
	}
      }
      if(outFlag == true) {
	if(ans != -2) {
	  ans = -2;
	  break;
	}
	else {
	  ans = j;
	}
      }
    }
    
    cout<<++ans<<endl;
  }
}

C++: #include<iostream>
#include<vector>
#include<string>
#include<algorithm>	
#include<map>
#include<set>
#include<utility>
#include<cmath>
#include<cstring>
#include<queue>
#include<stack>
#include<cstdio>
#include<sstream>
#include<iomanip>
#include<assert.h>
#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 mt make_tuple
#define all(in) in.begin(),in.end()
#define shosu(x) fixed<<setprecision(x)
using namespace std;
//kaewasuretyuui
typedef long long ll;
typedef int Def;
typedef pair<Def,Def> pii;
typedef vector<Def> vi;
typedef vector<vi> vvi;
typedef vector<pii> vp;
typedef vector<vp> vvp;
typedef vector<string> vs;
typedef vector<double> vd;
//typedef tuple<int,int,int> tp;
//typedef vector<tp> vt;
typedef vector<vd> vvd;
typedef pair<Def,pii> pip;
typedef vector<pip>vip;
const double PI=acos(-1);
const double EPS=1e-7;
const int inf=1e9;
const ll INF=2e18;
int dx[]={0,1,0,-1};
int dy[]={1,0,-1,0};
int main(){
	int n;
	while(cin>>n,n){
		vvi in(n,vi(n));
		rep(i,n){
			int a;
			cin>>a;
			rep(j,a){
				int b;
				cin>>b;
				in[i][b-1]=1;
			}
		}
		vi out;
		int a;
		cin>>a;
		vi m(a);
		rep(i,a)cin>>m[i];
		rep(i,n){
			bool h=true;
			rep(j,a)if(in[i][m[j]-1]==0)h=false;
			if(h)out.pb(i+1);
		}
		if(out.size()==1)cout<<out[0]<<endl;
		else cout<<-1<<endl;
	}
}

C++: #include <map>
#include <set>
#include <list>
#include <cstdio>
#include <cmath>
#include <deque>
#include <queue>
#include <stack>
#include <bitset>
#include <cctype>
#include <string>
#include <vector>
#include <cstdlib>
#include <cstring>
#include <iomanip>
#include <sstream>
#include <iostream>
#include <algorithm>
#include <functional>

using namespace std;

#define fr first
#define sc second
#define mp make_pair

typedef long long int64;
typedef pair< int, int > iP;
typedef pair< iP, int > iiP;

const int INF = 2 << 28;
const double EPS = 1e-10;

int main() {

    int N;
    while(cin >> N, N) {
        int K;
        vector< vector< bool > > info(N);
        for(int i = 0; i < N; i++) {
            int M; cin >> M;
            info[i] = vector< bool >(M + 1, false);
            for(int j = 0; j < M; j++) {
                int p; cin >> p;
                info[i][p] = true;
            }
        }
        cin >> K;
        vector< int > pub(K), ans;
        for(int i = 0; i < K; i++)
            cin >> pub[i];
        for(int i = 0; i < N; i++) {
            int cnt = 0;
            for(int j = 0; j < K; j++) {
                cnt += info[i][pub[j]];
            }
            if(cnt == K) ans.push_back(i + 1);
        }
        if(ans.size() != 1) cout << -1 << endl;
        else cout << ans[0] << endl;
    }
}