#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]; 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); } for (it = start.begin(); it != start.end(); ++it) { m[*it] = 1; q.push(make_pair(1, *it)); } ret = 0; while (!q.empty()) { k = q.front().first; t = q.front().second; q.pop(); if (k == L && end.find(t) != end.end()) ret += m[k]; for (it = d[t].begin(); it != d[t].end(); ++it) { m[*it] += m[t]; q.push(make_pair(k+1, *it)); } } if (ret == 0) printf("impossible\n"); else printf("%lld\n", ret); } return 0; }