#include<cstdio>
#include<iostream>
#include<algorithm>
#include<string>
#include<cstring>
#include<vector>
#include<stack>
#include<queue>
#include<deque>
#include<map>
#include<set>
#include<limits>
#include<climits>
#include<cmath>
#include<functional>
#include<ctime>
#include<cstdlib>
#include<fstream>
using namespace std;
struct data
{
int height,age,indicator;
};
const int MAX = 64;
data men_data[MAX];
data women_data[MAX];
int men_match[MAX],women_match[MAX];
bool used[MAX];
vector <int> preferences[MAX];
int n,m;
int alternating_path[256],sz;
void input()
{
int i,j;
memset(men_match,0,sizeof(men_match));
memset(women_match,0,sizeof(women_match));
for(i=0;i<MAX;i++)
preferences[i].clear();
scanf("%d %d", &n, &m);
for(i=1;i<=n;i++)
{
scanf("%d %d %d", &men_data[i].height, &men_data[i].age, &men_data[i].indicator);
}
for(i=1;i<=m;i++)
{
scanf("%d %d %d", &women_data[i].height, &women_data[i].age, &women_data[i].indicator);
}
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
if(abs(men_data[i].height-women_data[j].height)<=12)
if(abs(men_data[i].age-women_data[j].age)<=5)
if(men_data[i].indicator==women_data[j].indicator)
preferences[i].push_back(j);
}
}
}
bool DFS(int curr, bool type)
{
alternating_path[sz++]=curr;
if(type==0)
{
for(int i=0;i<preferences[curr].size();i++)
{
if(!used[preferences[curr][i]] && women_match[preferences[curr][i]]!=curr)
{
used[preferences[curr][i]]=true;
if(DFS(preferences[curr][i],1))
return true;
used[preferences[curr][i]]=false;
}
}
}
else
{
if(women_match[curr]==0)
return true;
if(DFS(women_match[curr],0))
return true;
}
sz--;
return false;
}
void solve()
{
bool path_found;
int i;
int ans=0;
while(true)
{
sz=0;
path_found=false;
for(i=1;i<=n;i++)
{
memset(used,0,sizeof(used));
if(men_match[i]==0)
{
if(DFS(i,0))
{
path_found=true;
break;
}
}
}
if(path_found==false)
break;
for(i=0;i<sz;i+=2)
{
men_match[alternating_path[i]]=alternating_path[i+1];
women_match[alternating_path[i+1]]=alternating_path[i];
}
}
for(i=1;i<=n;i++)
ans+=(men_match[i]>0);
printf("%d\n", ans);
}
int main()
{
int i,t;
scanf("%d", &t);
for(i=1;i<=t;i++)
{
input();
printf("Case %d: ", i);
solve();
}
return 0;
}
I2luY2x1ZGU8Y3N0ZGlvPgojaW5jbHVkZTxpb3N0cmVhbT4KI2luY2x1ZGU8YWxnb3JpdGhtPgojaW5jbHVkZTxzdHJpbmc+CiNpbmNsdWRlPGNzdHJpbmc+CiNpbmNsdWRlPHZlY3Rvcj4KI2luY2x1ZGU8c3RhY2s+CiNpbmNsdWRlPHF1ZXVlPgojaW5jbHVkZTxkZXF1ZT4KI2luY2x1ZGU8bWFwPgojaW5jbHVkZTxzZXQ+CiNpbmNsdWRlPGxpbWl0cz4KI2luY2x1ZGU8Y2xpbWl0cz4KI2luY2x1ZGU8Y21hdGg+CiNpbmNsdWRlPGZ1bmN0aW9uYWw+CiNpbmNsdWRlPGN0aW1lPgojaW5jbHVkZTxjc3RkbGliPgojaW5jbHVkZTxmc3RyZWFtPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnN0cnVjdCBkYXRhCnsKICAgIGludCBoZWlnaHQsYWdlLGluZGljYXRvcjsKfTsKCmNvbnN0IGludCBNQVggPSA2NDsKCmRhdGEgbWVuX2RhdGFbTUFYXTsKZGF0YSB3b21lbl9kYXRhW01BWF07CgppbnQgbWVuX21hdGNoW01BWF0sd29tZW5fbWF0Y2hbTUFYXTsKYm9vbCB1c2VkW01BWF07CnZlY3RvciA8aW50PiBwcmVmZXJlbmNlc1tNQVhdOwoKaW50IG4sbTsKCmludCBhbHRlcm5hdGluZ19wYXRoWzI1Nl0sc3o7Cgp2b2lkIGlucHV0KCkKewogICAgaW50IGksajsKICAgIG1lbXNldChtZW5fbWF0Y2gsMCxzaXplb2YobWVuX21hdGNoKSk7CiAgICBtZW1zZXQod29tZW5fbWF0Y2gsMCxzaXplb2Yod29tZW5fbWF0Y2gpKTsKICAgIGZvcihpPTA7aTxNQVg7aSsrKQogICAgICAgIHByZWZlcmVuY2VzW2ldLmNsZWFyKCk7CiAgICBzY2FuZigiJWQgJWQiLCAmbiwgJm0pOwogICAgZm9yKGk9MTtpPD1uO2krKykKICAgIHsKICAgICAgICBzY2FuZigiJWQgJWQgJWQiLCAmbWVuX2RhdGFbaV0uaGVpZ2h0LCAmbWVuX2RhdGFbaV0uYWdlLCAmbWVuX2RhdGFbaV0uaW5kaWNhdG9yKTsKICAgIH0KICAgIGZvcihpPTE7aTw9bTtpKyspCiAgICB7CiAgICAgICAgc2NhbmYoIiVkICVkICVkIiwgJndvbWVuX2RhdGFbaV0uaGVpZ2h0LCAmd29tZW5fZGF0YVtpXS5hZ2UsICZ3b21lbl9kYXRhW2ldLmluZGljYXRvcik7CiAgICB9CiAgICBmb3IoaT0xO2k8PW47aSsrKQogICAgewogICAgICAgIGZvcihqPTE7ajw9bTtqKyspCiAgICAgICAgewogICAgICAgICAgICBpZihhYnMobWVuX2RhdGFbaV0uaGVpZ2h0LXdvbWVuX2RhdGFbal0uaGVpZ2h0KTw9MTIpCiAgICAgICAgICAgICAgICBpZihhYnMobWVuX2RhdGFbaV0uYWdlLXdvbWVuX2RhdGFbal0uYWdlKTw9NSkKICAgICAgICAgICAgICAgICAgICBpZihtZW5fZGF0YVtpXS5pbmRpY2F0b3I9PXdvbWVuX2RhdGFbal0uaW5kaWNhdG9yKQogICAgICAgICAgICAgICAgICAgICAgICBwcmVmZXJlbmNlc1tpXS5wdXNoX2JhY2soaik7CiAgICAgICAgfQogICAgfQp9CmJvb2wgREZTKGludCBjdXJyLCBib29sIHR5cGUpCnsKICAgIGFsdGVybmF0aW5nX3BhdGhbc3orK109Y3VycjsKICAgIGlmKHR5cGU9PTApCiAgICB7CiAgICAgICAgZm9yKGludCBpPTA7aTxwcmVmZXJlbmNlc1tjdXJyXS5zaXplKCk7aSsrKQogICAgICAgIHsKICAgICAgICAgICAgaWYoIXVzZWRbcHJlZmVyZW5jZXNbY3Vycl1baV1dICYmIHdvbWVuX21hdGNoW3ByZWZlcmVuY2VzW2N1cnJdW2ldXSE9Y3VycikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdXNlZFtwcmVmZXJlbmNlc1tjdXJyXVtpXV09dHJ1ZTsKICAgICAgICAgICAgICAgIGlmKERGUyhwcmVmZXJlbmNlc1tjdXJyXVtpXSwxKSkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgIHVzZWRbcHJlZmVyZW5jZXNbY3Vycl1baV1dPWZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZWxzZQogICAgewogICAgICAgIGlmKHdvbWVuX21hdGNoW2N1cnJdPT0wKQogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICBpZihERlMod29tZW5fbWF0Y2hbY3Vycl0sMCkpCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgc3otLTsKICAgIHJldHVybiBmYWxzZTsKfQp2b2lkIHNvbHZlKCkKewogICAgYm9vbCBwYXRoX2ZvdW5kOwogICAgaW50IGk7CiAgICBpbnQgYW5zPTA7CiAgICB3aGlsZSh0cnVlKQogICAgewogICAgICAgIHN6PTA7CiAgICAgICAgcGF0aF9mb3VuZD1mYWxzZTsKICAgICAgICBmb3IoaT0xO2k8PW47aSsrKQogICAgICAgIHsKICAgICAgICAgICAgbWVtc2V0KHVzZWQsMCxzaXplb2YodXNlZCkpOwogICAgICAgICAgICBpZihtZW5fbWF0Y2hbaV09PTApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmKERGUyhpLDApKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHBhdGhfZm91bmQ9dHJ1ZTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZihwYXRoX2ZvdW5kPT1mYWxzZSkKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgZm9yKGk9MDtpPHN6O2krPTIpCiAgICAgICAgewogICAgICAgICAgICBtZW5fbWF0Y2hbYWx0ZXJuYXRpbmdfcGF0aFtpXV09YWx0ZXJuYXRpbmdfcGF0aFtpKzFdOwogICAgICAgICAgICB3b21lbl9tYXRjaFthbHRlcm5hdGluZ19wYXRoW2krMV1dPWFsdGVybmF0aW5nX3BhdGhbaV07CiAgICAgICAgfQogICAgfQogICAgZm9yKGk9MTtpPD1uO2krKykKICAgICAgICBhbnMrPShtZW5fbWF0Y2hbaV0+MCk7CiAgICBwcmludGYoIiVkXG4iLCBhbnMpOwp9CmludCBtYWluKCkKewogICAgaW50IGksdDsKICAgIHNjYW5mKCIlZCIsICZ0KTsKICAgIGZvcihpPTE7aTw9dDtpKyspCiAgICB7CiAgICAgICAgaW5wdXQoKTsKICAgICAgICBwcmludGYoIkNhc2UgJWQ6ICIsIGkpOwogICAgICAgIHNvbHZlKCk7CiAgICB9CiAgICByZXR1cm4gMDsKfQo=