#include <iostream>
#include <map>
#include <unordered_map>
#include <vector>
#include <algorithm>
#include <iomanip>

using namespace std;

struct Point {
	double x;
	double y;
	Point(double x, double y) :x(x), y(y) {}
	Point() :x(0), y(0) {}
};

struct Rectangle {
	Point topLeft;
	Point bottomRight;
	Rectangle(Point topLeft, Point bottomRight) :topLeft(topLeft), bottomRight(bottomRight) {}
	Rectangle(){}
};

int compress(vector<double> &x, unordered_map<double, int>& zip, vector<double>& unzip) {
	sort(x.begin(), x.end());
	x.erase(unique(x.begin(), x.end()), x.end());
	unzip.resize(x.size());
	for (size_t i = 0; i < x.size(); i++)
	{
		zip[x[i]] = i;
		unzip[i] = x[i];
	}
	return zip.size();
}

double solve(const vector<Rectangle> rectangles) {
	vector<double> xs;
	unordered_map<double, int> xZip;
	vector<double> xUnzip;
	vector<double> ys;
	unordered_map<double, int> yZip;
	vector<double> yUnzip;

	for (auto &r : rectangles) {
		xs.push_back(r.topLeft.x);
		xs.push_back(r.bottomRight.x);
		ys.push_back(r.topLeft.y);
		ys.push_back(r.bottomRight.y);
	}
	vector<vector<bool> > checker(ys.size(), vector<bool>(xs.size(), false));
	compress(xs, xZip, xUnzip);
	compress(ys, yZip, yUnzip);

	for (auto &r : rectangles) {
		for (int y = yZip[r.topLeft.y]; y < yZip[r.bottomRight.y]; ++y) {
			for (int x = xZip[r.topLeft.x]; x < xZip[r.bottomRight.x]; ++x) {
				checker[y][x] = true;
			}
		}
	}

	double res = 0.0;
	for (int y = 0; y < yUnzip.size()-1 ; ++y) for (int x = 0; x < xUnzip.size()-1; ++x) if (checker[y][x]) {
		res += (yUnzip[y + 1] - yUnzip[y]) * (xUnzip[x + 1] - xUnzip[x]);
	}
	return res;
	
}

int main(void) {
	int cnt = 0;
	while (1) {
		++cnt;
		vector<Rectangle> rectangles;
		int n; cin >> n;
		if (n == 0) break;
		for (int i = 0; i < n; ++i) {
			double x, y, r;
			cin >> x >> y >> r;
			rectangles.push_back(Rectangle(Point(x - r, y - r), Point(x + r, y + r)));
		}
		cout << fixed << setprecision(2) << cnt << " " <<  solve(rectangles) << endl;
	}
}