#include #include #include #include #include using namespace std; int N, L, B, F, j, k, i, c, t; set d[1001]; set start, end; set::iterator it; queue > q; long long m[1001]; long long nm[1001]; map::iterator itm; long long 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] = 0; 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] = 1; //q.push(make_pair(1, *it)); } for (k = 1; k < L; k++) { bool done = true; ret = 0; for (i = 1; i <= N; i++) { m[i] = nm[i]; nm[i] = 0; } for (i = 1; i <= N; i++) { if (m[i] > 0) { for (it = d[i].begin(); it != d[i].end(); ++it) { nm[*it] += m[i]; } done = false; ret += m[i]; } } if (done) break; } ret = 0; for (i = 1; i <= N; i++) { if (end.find(i) != end.end()) ret += nm[i]; } if (ret == 0) printf("impossible\n"); else printf("%lld\n", ret); } return 0; }