#include<bits/stdc++.h>
using namespace std;
int T;
const int N=1e5+10;
struct ty{
int x,y;
}a[N],b[N];
bool cmp1(ty a,ty b)
{
if(a.x == b.x)return a.y < b.y;
return a.x > b.x;
}//国王的队伍攻击力从大到小,相同时防御力值反之
bool cmp2(ty a,ty b)
{
if(a.y == b.y)return a.x < b.x;
return a.y > b.y;
}//敌军的队伍防御力从大到小,相同时攻击力值反之
int n,m;
int cnt=1;
int ans;
void solve()
{
multiset<int> q;
cin >> n >> m;
ans=n;
int i,j;
for(i=1;i<=n;i++){
cin >> a[i].x >> a[i].y;
}
for(i=1;i<=m;i++){
cin >> b[i].x >> b[i].y;
}
sort(a+1,a+1+n,cmp1);
sort(b+1,b+1+m,cmp2);
for(i=1,j=1;i<=m;i++){
while(j<=n&&a[j].x>=b[i].y){
q.insert(a[j].y);
j++;
}//国王队伍[j]的攻击力值大于等于敌军[i]的防御力值的编号push进q
auto it=q.upper_bound(b[i].x);//寻找录入q中防御力值大于敌军[i]的位置
if(it != q.end()){
q.erase(it);//由于每只队伍最多只能参加一次
}else{
if(q.empty()){
printf("Case #%d: -1\n",cnt);
cnt++;
return;//若q为空(即无部队可参与)则输出-1
}else{
ans--,q.erase(q.begin());//若q不为空,则选择首位(即攻击力当下max,防御力min的队伍)与其消除
}
}
}
printf("Case #%d: %d\n",cnt,ans);
cnt++;
return;
}
int main()
{
cin >> T;
while(T--){
solve();
}
}