#include "bits/stdc++.h"
using namespace std;
#define fi first
#define se second
#define ll long long
#define dbg(v) cerr<<#v<<" = "<<v<<'\n'
#define vi vector<int>
#define vl vector <ll>
#define pii pair<int,int>
#define mp make_pair
#define db long double
#define pb push_back
#define all(s) s.begin(),s.end()
template < class T > T smin(T &a,T b) {if (a > b) a = b;return a;}
template < class T > T smax(T &a,T b) {if (a < b) a = b;return a;}
const int N = (int)(1e6) + 5;
int s[N][3];
int cb(int x,int y) {
	if (x == 0)
		return y;
	if (y == 0)
		return x;
	if (x == y)
		return x;
	else
		return -1;
}
int t[N];
void update(int l,int r,int pos,int vv,int node) {
	if (l == r)
		t[node] = vv;
	else {
		int m = (l + r) / 2;
		if (pos <= m)
			update(l,m,pos,vv,node * 2);
		else
			update(m+1,r,pos,vv,node * 2 + 1);
		t[node] = cb(t[node * 2],t[node * 2 + 1]);
	}
}
int query(int l,int r,int l1,int r1,int node) {
	if (l1 <= l && r <= r1)
		return t[node];
	int m = (l + r) / 2;
	int ans = 0;
	if (l1 <= m)
		ans = cb(ans,query(l,m,l1,r1,node * 2));
	if (m+1<=r1)
		ans = cb(ans,query(m+1,r,l1,r1,node * 2 + 1));	
	return ans;
}
int main(void) {
    int T;
    cin>>T;
    for (int cs = 1;cs <= T;++cs) {
    	cout << "Case #" << cs << ": ";
    	int n;
    	cin>>n;
    	vi w;
    	for (int i = 1;i <= n;++i) {
    		int a,b,c;
    		cin>>a>>b>>c;
    		s[i][0] = a + b;
    		s[i][1] = a - c;
    		w.pb(s[i][0]);
    		w.pb(s[i][1]);
    	}
    	int ans = -1;
    	sort(all(w));
    	w.resize(unique(all(w)) - w.begin());
    	const int SZ = w.size();
    	for (int i = 1;i <= n;++i) {
    		s[i][0] = lower_bound(all(w),s[i][0]) - w.begin() + 1;
    		s[i][1] = lower_bound(all(w),s[i][1]) - w.begin() + 1;
    	}
    	vector < vi > pos(SZ + 5);
    	for (int i = 1;i <= n;++i) {
    		pos[s[i][0]].pb(i);
    	}
    	for (int i = 1;i <= n;++i)
    		update(1,n,i,s[i][1],1);
    	set < pii > indices;
    	for (int tt = 1;tt <= SZ;++tt) {
    		for (auto it : pos[tt])
    			update(1,n,it,0,1);
    		for (auto it : pos[tt]) {
    			int l = it,r = it;
    			for (int t = 1 << 20;t;t /= 2) {
	    				if (l > t) {
	    					if (query(1,n,l - t,r,1) != -1)
	    						l -= t;
	    				}
    				}
    			for (int t = 1 << 20;t;t /= 2) {
    				if (r + t <= n) {
    						if (query(1,n,l,r + t,1) != -1)
	    						r += t;
	    				}
    			}
                if (r - l + 1 > ans)
    				ans = r - l + 1,indices.clear();
    			if (r - l + 1 == ans)
    				indices.insert(mp(l,r));
    			l = r = it;
    			for (int t = 1 << 20;t;t /= 2) {
    				if (r + t <= n) {
	    					if (query(1,n,l,r + t,1) != -1)
	    						r += t;
	    				}
    			}
    			for (int t = 1 << 20;t;t /= 2) {
	    				if (l > t) {
                            if (query(1,n,l - t,r,1) != -1)  
	    						l -= t;
	    				}
    				}
                if (r - l + 1 > ans)
    				ans = r - l + 1,indices.clear();
    			if (r - l + 1 == ans)
    				indices.insert(mp(l,r));
    		}
    		for (auto it : pos[tt])
    			update(1,n,it,s[it][1],1);	
    	}
    	cout << ans << ' ' << indices.size() << '\n';
    }
    return 0;
}