#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
struct Trie
{
Trie *next[26];
int sum;
Trie()
{
for(int i=0;i<26;i++)
next[i]=NULL;
sum=0;
}
}*root=new Trie,*temp;
void MakeTrie(char str[])
{
temp=root;
for(int i=0;str[i]!='\0';i++)
{
if(temp->next[str[i]-'a']==NULL)
temp=temp->next[str[i]-'a']=new Trie;
else
temp=temp->next[str[i]-'a'];
(temp->sum)++;
}
}
void Freedom(Trie* &p)
{
if(p==NULL)
return ;
for(int i=0;i<26;i++)
if(p->next[i]!=NULL)
Freedom(p->next[i]);
delete p;
p=NULL;
}
int FindTrie(char str[])
{
temp=root;
for(int i=0;str[i]!='\0';i++)
{
if(temp->next[str[i]-'a']==NULL)
return 0;
else
temp=temp->next[str[i]-'a'];
}
return temp->sum;
}
int get(int num[])
{
int sum=0;
int k=1;
for(int i=7;i>=0;i--)
{
sum+=num[i]*k;
k<<=1;
}
return sum;
}
int main()
{
char str[100];
int ans=0;
int n,m;
double num[10];
int N[10];
double av;
int k;
double Max=-1111111.0;
double Min=100000.0;
while(cin>>n>>m)
{
for(int i=1;i<=n;i++)
{
scanf("%s",str);
MakeTrie(str);
}
ans=0;
while(m--)
{
cin>>k;
for(int cnt=0;cnt<k;cnt++)
{
Max=-1111111.0;
Min=100000.0;
for(int i=0;i<8;i++)
{
scanf("%lf",&num[i]);
Max=max(Max,num[i]);
Min=min(Min,num[i]);
}
av=(Max+Min)/2.0;
for(int i=0;i<8;i++)
{
if(num[i]>=av)
N[i]=1;
else
N[i]=0;
}
str[cnt]=get(N);
}
str[k]='\0';
ans+=FindTrie(str);
}
for(int i=0;i<26;i++)
Freedom(root->next[i]);
cout<<ans<<endl;
}
return 0;
}