#include #include #include #include #include using namespace std; int N, L, B, F, j, k, i, c; set d[1001]; set start, end; set::iterator it; queue q; map 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].clear(); 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] = 1; q.push(*it); } while (!q.empty()) { k = q.front(); q.pop(); for (it = d[k].begin(); it != d[k].end(); ++it) { for (itm = m[k].begin(); itm != m[k].end(); ++itm) { m[*it][itm->second + 1] += m[k][itm->second]; } q.push(*it); } } ret = 0; for (it = end.begin(); it != end.end(); ++it) { ret += m[*it][L]; } if (ret == 0) printf("impossible\n"); else printf("%lld\n", ret); } return 0; }