#include #include #define MAX 1010 #define POCET 50 #define MIL 1000000000 struct bigint { int c[POCET]; int num; }; int degree[MAX]; bigint pocty[MAX][MAX]; int nasl[MAX][MAX]; int N, z, s, len; void set(bigint* a, int val) { a->c[0] = val; a->num = 1; for (int i = 1; i < POCET; i++) a->c[i] = 0; } void add(bigint* a, bigint* b) { for (int i = 0; i < b->num; i++) { a->c[i] += b->c[i]; } if (a->num < b->num) a->num = b->num; for (int i = 0; i < a->num+1; i++) { a->c[i+1] += a->c[i] / MIL; a->c[i] %= MIL; } if (a->c[a->num]) a->num++; } int isnull(bigint* a) { return !(a->num > 1 || a->c[0] != 0); } void print(bigint* a) { printf("%d", a->c[a->num-1]); for (int i = a->num-2; i >= 0; i--) printf("%09d", a->c[i]); printf("\n"); } void DFS(int v) { //printf("DFS %d\n", v); if (degree[v] == -1) return; for (int i = 0; i < degree[v]; i++) { DFS(nasl[v][i]); for (int j = 0; j < len+2; j++) add(&pocty[v][j+1], &pocty[nasl[v][i]][j]); } /*printf("pocty for %d: ", v); for (int i = 0; i < 10; i++) { printf("%lld, ", pocty[v][i]); } printf("\n");*/ degree[v] = -1; } int main() { while (1) { scanf("%d %d %d %d", &N, &len, &z, &s); if (N == 0) break; for (int i = 1; i <= N; i++) { int deg, deg2; scanf("%d %d", °2, °); degree[i] = deg; for (int j = 0; j < deg; j++) { scanf("%d", &nasl[i][j]); } } degree[0] = z; degree[N+1] = 0; for (int i = 0; i < z; i++) { int tmp; scanf("%d", &tmp); nasl[0][i] = tmp; } for (int i = 0; i < s; i++) { int tmp; scanf("%d", &tmp); nasl[tmp][degree[tmp]++] = N+1; } if (len > N) { printf("impossible\n"); continue; } for (int i = 0; i < N+5; i++) { for (int j = 0; j < N+5; j++) { set(&pocty[i][j], 0); } } set(&pocty[N+1][0], 1); DFS(0); if (!isnull(&pocty[0][len+1])) print(&pocty[0][len+1]); else printf("impossible\n"); } return 0; }