#include<stdio.h>
#include<stdlib.h>
struct node
{
int data;
node *next;
};
struct node2
{
int need;
int key[5];
node2 *next;
};
void f(int t,int*sum,node *M,node2 *N,int k)
{
int c;
while(M[t].next!=NULL)
{
c=M[t].next->data;
M[t].next=M[t].next->next;
N[c].need++;
if(N[c].need==k)
{
*sum=*sum+1;
for(int i=0; i<k; i++)
f(N[c].key[i],sum,M,N,k);
}
}
}
int main()
{
int n,m,k,t,sum,i,j,c;
scanf("%d%d%d%d",&n,&m,&k,&t);
int T[t];
node M[m];
node2 N[n];
node *ptr=NULL;
sum=0;
for(i=0; i<t;i++)
scanf("%d",&T[i]);
for(i=0; i<m;i++)
M[i].next=NULL;
for(i=0; i<n;i++)
{
N[i].need=0;
for(j=0; j<k;j++)
{
scanf("%d",&c);
node *newnode=(node*)malloc(sizeof(node));
newnode->next=NULL;
newnode->data=i;
ptr=&M[c];
while(ptr->next!=NULL)
ptr=ptr->next;
ptr->next=newnode;
}
}
for(i=0; i<n;i++)
for(j=0; j<k;j++)
scanf("%d",&N[i].key[j]);
for(i=0; i<t;i++)
f(T[i],&sum,&M[0],&N[0],k);
printf("%d",sum);
}