#include #include #include #include #include #include #include #include #include #include #include #include using namespace std; typedef long long ll; typedef long double ld; typedef pair PII; #define pb push_back #define fi first #define se second struct Vrchol { vector next; int co; }; long long mat[1010][1010]; int main() { while(1) { Vrchol v[1010]; int N, L, B, F; scanf("%d %d %d %d", &N, &L, &B, &F); if(N==0) break; int a, b; for(int i = 0; i < N; i++) v[i].co = 0; for(int i = 0; i < N; i++) { scanf("%d %d", &a, &b); for(int j = 0; j < b; j++) { scanf("%d", &a); v[i].next.pb(a-1); v[a-1].co++; } } /*if(L > N){ printf("impossible 1\n"); continue; }*/ for(int i = 0; i < N; i++) for(int j = 0; j < 1010; j++) mat[i][j]=0; queue fr; for(int i = 0; i < B; i++) { scanf("%d", &a); mat[a-1][1] = 1; fr.push(a-1); } int x; while(!fr.empty()) { x = fr.front(); fr.pop(); // printf("fr %d\n", x); for(int i = 0; i < v[x].next.size(); i++) { for(int j = 0; j < 1009; j++) { mat[v[x].next[i]][j+1]+=mat[x][j]; } v[v[x].next[i]].co--; if(v[v[x].next[i]].co==0) fr.push(v[x].next[i]); } } long long sum = 0; for(int i = 0; i < F; i++) { scanf("%d", &a); if(L < 1010) sum+=mat[a-1][L]; } if(sum==0) printf("impossible\n"); else printf("%Ld\n", sum); } return 0; }