#include #include #include #include #include using namespace std; const int MAXD = 50; struct BigInt { char d; char c[MAXD]; void operator += (BigInt& s) { static int i, maxd; maxd = s.d; if (maxd < d) maxd = d; for (i = 1; i <= maxd; i++) { c[MAXD-i] += s.c[MAXD - i]; if (c[MAXD-i] > 9) { c[MAXD-i] -= 10; c[MAXD-i-1]++; } } d = maxd; if (c[MAXD -d -1] > 0) d++; } void zero() { static int i; for (i = 0; i < MAXD; i++) c[i] = 0; } bool is_zero() { return d == 1 && c[MAXD-d] == 0; } void one() { static int i; for (i = 0; i < MAXD; i++) c[i] = 0; d = 1; c[MAXD - d] = 1; } void print() { static int i; for (i = d; i >= 1; i--) printf("%d", c[MAXD-i]); } }; int N, L, B, F, j, k, i, c, t; set d[1001]; set start, end; set::iterator it; queue > q; BigInt m[1001]; BigInt nm[1001]; map::iterator itm; BigInt ret; int main() { while (scanf("%d%d%d%d", &N, &L, &B, &F), N > 0) { start.clear(); end.clear(); for (i = 0; i < N; i++) { m[i+1].zero(); scanf("%d%d", &j, &k); d[j].clear(); while (k-- > 0) { scanf("%d", &c); d[j].insert(c); } } for (i = 0; i < B; i++) { scanf("%d", &c); start.insert(c); } for (i = 0; i < F; i++) { scanf("%d", &c); end.insert(c); //printf("e%d\n", c); } for (it = start.begin(); it != start.end(); ++it) { nm[*it].one(); //q.push(make_pair(1, *it)); } for (k = 1; k < L; k++) { bool done = true; for (i = 1; i <= N; i++) { m[i] = nm[i]; nm[i].zero(); } for (i = 1; i <= N; i++) { if (!m[i].is_zero()) { for (it = d[i].begin(); it != d[i].end(); ++it) { nm[*it] += m[i]; } done = false; } } if (done) break; } ret.zero(); for (i = 1; i <= N; i++) { if (end.find(i) != end.end()) ret += nm[i]; } if (ret.is_zero()) printf("impossible"); else ret.print(); putchar('\n'); // if (ret) printf("impossible\n"); // else printf("%lld\n", ret); } return 0; }