#include #include #include using namespace std; const int mod = 1000000000; int n, l, b, f; vector sus[1000]; vector bs; vector fs; int res[2][1001][1000]; int len[2][1001]; int cr; int nt; void add(int x, int y) { int* a = res[cr][x]; int* b = res[nt][y]; int la = len[cr][x]; int lb = len[nt][y]; int zv = 0; //printf("%d + %d = ", la == 0 ? 0 : a[0], lb == 0 ? 0 : b[0]); for (int i = 0; i < min(la, lb); i ++) { b[i] += a[i] + zv; zv = b[i] / mod; b[i] %= mod; } if (la > lb) { for (int i = lb; i < la; i ++) { b[i] = a[i] + zv; zv = b[i] / mod; b[i] %= mod; } len[nt][y] = la; } else { for (int i = la; zv > 0 && i < lb; i ++) { b[i] += zv; zv = b[i] / mod; b[i] %= mod; } } if (zv > 0) { b[len[nt][y]] = zv; len[nt][y] += 1; } //printf("%d\n", b[0]); } int main() { scanf("%d %d %d %d", &n, &l, &b, &f); while (n > 0) { for (int i = 0; i < n; i ++) { sus[i].clear(); } for (int i = 0; i < n; i ++) { int ii, di; scanf("%d %d", &ii, &di); ii -= 1; for (int j = 0; j < di; j ++) { int s; scanf("%d", &s); s -= 1; sus[ii].push_back(s); } } bs.clear(); for (int i = 0; i < b; i ++) { int bb; scanf("%d", &bb); bb -= 1; bs.push_back(bb); } fs.clear(); for (int i = 0; i < f; i ++) { int ff; scanf("%d", &ff); ff -= 1; fs.push_back(ff); } //printf("nacitanych %d riadkov\n", n); if (l > n) { printf("impossible\n"); goto nxt; } cr = 0; for (int i = 0; i < n; i ++) { len[cr][i] = 0; } for (int i = 0; i < b; i ++) { len[cr][bs[i]] = 1; res[cr][bs[i]][0] = 1; } for (int ll = 1; ll < l; ll ++) { nt = 1 - cr; for (int i = 0; i < n; i ++) { len[nt][i] = 0; } for (int i = 0; i < n; i ++) { if (len[cr][i] != 0) { for (int j = 0; j < sus[i].size(); j ++) { add(i, sus[i][j]); } } } cr = nt; } nt = 1 - cr; len[nt][1000] = 0; for (int i = 0; i < f; i ++) { add(fs[i], 1000); } if (len[nt][1000] == 0) { printf("impossible\n"); goto nxt; } else { printf("%d", res[nt][1000][len[nt][1000] - 1]); for (int i = len[nt][1000] - 2; i >= 0; i --) { printf("%.9d", res[nt][1000][i]); } } printf("\n"); nxt: scanf("%d %d %d %d", &n, &l, &b, &f); } return 0; }