#include<stdio.h>
#include<algorithm>
using namespace std;
struct node
{
int A,B,C,D;
bool operator<(const node &t) const
{
if(A<t.A)
return true;
else if(A==t.A)
{
if(B<t.B)
return true;
else if(B==t.B)
{
if(C<t.C)
return true;
else if(C==t.C)
{
if(D<t.D)
return true;
else
return false;
}
else
return false;
}
else
return false;
}
else
return false;
}
}Ip[1010],Ip2[60];
int main()
{
int T,n,m,i,k=1,j,count,tag1,tag2;
int a,b,c,d;
int prea,preb,prec,pred;
scanf("%d",&T);
while(T--)
{
tag1=0;
tag2=0;
scanf("%d %d",&n,&m);
for(i=0;i<n;i++)
{
scanf("%d.%d.%d.%d",&a,&b,&c,&d);
if(a>255||a<0||b>255||b<0||c>255||c<0||d>255||d<0)
continue;
Ip[tag1].A=a;
Ip[tag1].B=b;
Ip[tag1].C=c;
Ip[tag1].D=d;
tag1++;
}
for(i=0;i<m;i++)
{
scanf("%d.%d.%d.%d",&a,&b,&c,&d);
if(a>255||a<0||b>255||b<0||c>255||c<0||d>255||d<0)
continue;
Ip2[tag2].A=a;
Ip2[tag2].B=b;
Ip2[tag2].C=c;
Ip2[tag2].D=d;
tag2++;
}
sort(Ip,Ip+tag1);
/*for(i=0;i<n;i++)
{
printf("%d %d %d %d\n",Ip[i].A,Ip[i].B,Ip[i].C,Ip[i].D);
}*/
printf("Case #%d:\n",k++);
for(i=0;i<tag2;i++)
{
j=0;
count=1;
prea=Ip2[i].A&Ip[j].A;
preb=Ip2[i].B&Ip[j].B;
prec=Ip2[i].C&Ip[j].C;
pred=Ip2[i].D&Ip[j].D;
for(j=1;j<tag1;j++)
{
a=Ip2[i].A&Ip[j].A;
b=Ip2[i].B&Ip[j].B;
c=Ip2[i].C&Ip[j].C;
d=Ip2[i].D&Ip[j].D;
if(a!=prea||b!=preb||c!=prec||d!=pred)
{
count++;
prea=a;
preb=b;
prec=c;
pred=d;
}
}
printf("%d\n",count);
}
}
return 0;
}