#include #include #define MAX 1010 int degree[MAX]; long long int pocty[MAX][MAX]; int nasl[MAX][MAX]; int N, z, s, len; 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++) 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++) { pocty[i][j] = 0; } } pocty[N+1][0] = 1; DFS(0); if (pocty[0][len+1]) printf("%lld\n", pocty[0][len+1]); else printf("impossible\n"); } return 0; }