/*
hdu 6006
solve: dp
*/
#include <bits/stdc++.h>
using namespace std;
vector<int> v[20],p[20],leg[20];
int cnt[200];
int dp[20][(1 << 10)];
int main(){
int T,kase = 1;
scanf("%d",&T);
while(T--){
memset(cnt,0,sizeof(cnt));
memset(dp, 0, sizeof(dp));
for(int i=0; i<20; i++){
v[i].clear();
p[i].clear();
leg[i].clear();
}
int n,m,c;
scanf("%d%d",&n,&m);
for (int i=0; i<n;i++) {
scanf("%d",&c);
for(int j=0; j<c; j++){
int val;
scanf("%d",&val);
v[i].push_back(val);
}
}
for(int i=0; i<m; i++){
int d;
scanf("%d",&d);
for(int j=0; j<d; j++){
int val;
scanf("%d",&val);
p[i].push_back(val);
}
}
for(int i=0; i<n; i++){
for(int st=0; st<(1 << m); st++){
memset(cnt, 0, sizeof(cnt));
int tot = 0;
for(int j=0; j<m; j++){
if (st & (1 << j)){
for(int k=0; k<p[j].size(); k++){
cnt[p[j][k]]++;
}
}
}
if (tot > 3) continue;
int tag = 1;
for(int k=0; k<v[i].size();k++){
if (!cnt[v[i][k]]) tag = 0;
}
if (tag) leg[i].push_back(st);
}
}
// for(int i=0; i<n; i++){
// for(int j=0; j<leg[i].size(); j++){
// cout << leg[i][j] << ' ';
// }
// }
for(int st=0; st<(1 << m); st++){
for(int j=0; j<leg[0].size(); j++){
if ((leg[0][j] | st) == st){
dp[0][st] = 1;
}
}
}
for(int i=1; i<n; i++){
for(int st=0; st<(1 << m); st++){
for(int j=0; j<leg[i].size(); j++){
if ((leg[i][j] | st) == st){
dp[i][st] = max(dp[i][st],dp[i-1][st-leg[i][j]] + 1);
}
}
dp[i][st] = max(dp[i][st],dp[i-1][st]);
}
}
printf("Case #%d: %d\n",kase++,dp[n-1][(1<<m)-1]);
}
return 0;
}