p01184 International Party_33296
Isaac H. Ives is attending an international student party (maybe for girl-hunting). Students there enjoy talking in groups with excellent foods and drinks. However, since students come to the party from all over the world, groups may not have a language spoken by all students of the group. In such groups, some student(s) need to work as interpreters, but intervals caused by interpretation make their talking less exciting.

Needless to say, students want exciting talks. To have talking exciting as much as possible, Isaac proposed the following rule: the number of languages used in talking should be as little as possible, and not exceed five. Many students agreed with his proposal, but it is not easy for them to find languages each student should speak. So he calls you for help.

Your task is to write a program that shows the minimum set of languages to make talking possible, given lists of languages each student speaks.



Input

The input consists of a series of data sets.

The first line of each data set contains two integers N (1 ≤ N ≤ 30) and M (2 ≤ M ≤ 20) separated by a blank, which represent the numbers of languages and students respectively. The following N lines contain language names, one name per line. The following M lines describe students in the group. The i-th line consists of an integer Ki that indicates the number of languages the i-th student speaks, and Ki language names separated by a single space. Each language name consists of up to twenty alphabetic letters.

A line that contains two zeros indicates the end of input and is not part of a data set.

Output

Print a line that contains the minimum number L of languages to be spoken, followed by L language names in any order. Each language name should be printed in a separate line. In case two or more sets of the same size is possible, you may print any one of them. If it is impossible for the group to enjoy talking with not more than five languages, you should print a single line that contains “Impossible” (without quotes).

Print an empty line between data sets.

Example

Input

3 4
English
French
Japanese
1 English
2 French English
2 Japanese English
1 Japanese
2 2
English
Japanese
1 English
1 Japanese
6 7
English
Dutch
German
French
Italian
Spanish
1 English
2 English Dutch
2 Dutch German
2 German French
2 French Italian
2 Italian Spanish
1 Spanish
0 0


Output

2
English
Japanese

Impossible

Impossible
import java.util.*;
import static java.lang.Math.*;
public class Main {
	final Scanner sc=new Scanner(System.in);
	public static void main(String[] args) {
		new Main().init();
	}
	void init(){
		final long STACK_SIZE=8*1024*1024;
		new Thread(null, new AOJ2061(), "RUN", STACK_SIZE).start();
	}
	
	// International party
	class AOJ2061 implements Runnable{
		AOJ2061(){}
		@Override public void run(){
			int c=0;
			while(sc.hasNext()){
				N=sc.nextInt();
				M=sc.nextInt();
				if((N|M)==0)	break;
				if(c>0)System.out.println();
				solve();
				++c;
			}
		}
		
		int N,M;
		String[] LANG;
		long[] ST;
		HashMap<String, Integer> dic;
		
		void solve(){
			LANG=new String[N];
			dic=new HashMap<String,Integer>();
			for(int i=0; i<N; ++i){
				LANG[i]=sc.next();
				dic.put(LANG[i], i);
			}
			
			ST=new long[M];
			for(int i=0; i<M; ++i){
				int K=sc.nextInt();
				for(int j=0; j<K; ++j){
					long tmp=dic.get(sc.next());
					ST[i]|=(1<<tmp);
				}
			}
			
			for(int i=1; i<=5; ++i){
				long ans=DFS(0,-1,0L,i);
				if(ans>0){
					System.out.println(Long.bitCount(ans));
					for(int j=0; j<N; ++j){
						long tmp=1<<j;
						if( (ans&tmp) >0 )	System.out.println(LANG[j]);
					}
					return;
				}
			}
			
			System.out.println("Impossible");
			
		}
		
		long DFS(int depth,int last,long used,int lim){
			
			if(depth==lim){
				int[] list=new int[Long.bitCount(used)];
				int idx=0;
				for(int i=0; i<N; ++i){
					if( (used&(1<<i)) > 0 ){
						list[idx]=i;
						++idx;
					}
				}
				boolean[] ret=isConnected(0, list, new boolean[M]);
				for(boolean b:ret)if(!b)	return 0L;
				return used;
			}
			
			long ret=0L;
			for(int i=last+1; i<N; ++i){
				long now=(1<<i);
				used|=now;
				
				long tmp=DFS(depth+1,i,used,lim);
				if(tmp > 0 && (ret == 0 || Long.bitCount(ret) < Long.bitCount(tmp) ) )	ret=tmp;
				
				used^=now;
			}
			
			return ret;
		}
		
		boolean[] isConnected(int n,int[] list,boolean[] vtd){
			for(int i=0; i<M; ++i){
				if(vtd[i])	continue;
				for(int j=0; j<list.length; ++j){
					long tmp=1<<list[j];
					if( (ST[i]&tmp) > 0 && (ST[n]&tmp) > 0 ){
						vtd[i]=true;
						vtd = isConnected(i,list,vtd);
					}
				}
			}
			return vtd;
		}
	}
}