#include #include #include #define MAX_N (30) #define MAX_M (20) #define MAX_L ( 5) #ifndef solve #define solve solve_AC #endif static int N; static int M; static int a[MAX_M]; static int v[MAX_M]; int size(int m) { m = ((m & 0xaaaaaaaa) >> 1) + (m & 0x55555555); m = ((m & 0xcccccccc) >> 2) + (m & 0x33333333); m = ((m & 0xf0f0f0f0) >> 4) + (m & 0x0f0f0f0f); m = ((m & 0xff00ff00) >> 8) + (m & 0x00ff00ff); m = ((m & 0xffff0000) >> 16) + (m & 0x0000ffff); return m; } int examine(int m) { int i, w, x, y; w = m & a[0]; x = 0; y = 1; while(x < y && y < M) { x = y; for(i = 1; i < M; i++) { if(v[i] != m && (w & a[i]) != 0) { v[i] = m; w |= m & a[i]; y++; } } } return y == M; } int solve_AC(void) { int m, n, x, y; for(n = 1; n <= MAX_L; n++) { for(m = (1 << n) - 1; m < (1 << N); ) { if(examine(m)) return m; x = m & ~(m - 1); y = m + x; m = (((m & ~y) / x) >> 1) | y; } } return 0; } int solve_TLE_1(void) { int m, n; int mmin, nmin; nmin = MAX_L + 1; mmin = 0; for(m = 1; m < (1 << N); m++) { n = size(m); if(n < nmin && examine(m)) { nmin = n; mmin = m; } } return mmin; } int solve_TLE_2(void) { int m, n; int mmin, nmin; int i, j; nmin = MAX_L + 1; mmin = 0; m = 0; n = 0; for(i = 1; i < (1 << N); i++) { j = i & ~(i - 1); n += (m & j) ? -1 : +1; m ^= j; if(n < nmin && examine(m)) { nmin = n; mmin = m; } } return mmin; } int main(void) { char name[25][21], s[21]; int i, j, k, m, n; int flag = 0; while(scanf("%d %d", &N, &M) != EOF) { if(N == 0 && M == 0) break; for(i = 0; i < N; i++) scanf("%s", name[i]); for(i = 0; i < M; i++) { a[i] = 0; v[i] = 0; scanf("%d", &n); for(j = 0; j < n; j++) { scanf("%s", s); for(k = 0; k < N; k++) { if(strcmp(s, name[k]) == 0) a[i] |= 1 << k; } } } m = solve(); if(flag) putchar('\n'); flag = 1; if(m == 0) { printf("Impossible\n"); } else { printf("%d\n", size(m)); for(i = 0; i < N; i++) { if((m & (1 << i)) != 0) puts(name[i]); } } } return 0; }