#include <iostream>
using namespace std;

struct box { int x[4],y[4],f,n,b[100];};

box bo[100];

int cross(int x1,int y1,int x2,int y2,int x3,int y3,int x4,int y4) {
	int v1,v2,v3,v4,x5,y5,x6,y6,x7,y7;
	x5=y3-y4; y5=x4-x3; x6=x3-x1; y6=y3-y1; x7=x3-x2; y7=y3-y2;
	v1=x5*x6+y5*y6; v2=x5*x7+y5*y7;
	x5=y1-y2; y5=x2-x1; x6=x1-x3; y6=y1-y3; x7=x1-x4; y7=y1-y4;
	v3=x5*x6+y5*y6; v4=x5*x7+y5*y7;
	if (v1*v2>0 || v3*v4>0) return 0;
	if ((v1==0 && v2==0) || (v3==0 && v4==0)) return 0;
	return 1;
}

int boxin(box b,int x,int y) {
	int i,x1,y1,x2,y2;
	for (i=0;i<4;i++) {
		x1=-(b.y[(i+1) % 4]-b.y[i]); y1=b.x[(i+1) % 4]-b.x[i];
		x2=b.x[i]-x; y2=b.y[i]-y;
		if (x1*x2+y1*y2<=0) return 0;
	}
	return 1;
}

int boxcross(box a,box b) {
	int i,j,k;
	for (i=0;i<4;i++) for (j=0;j<4;j++) {
	 k=cross(a.x[(i+1) % 4],a.y[(i+1) % 4],a.x[i],a.y[i],b.x[(j+1) % 4],b.y[(j+1) % 4],b.x[j],b.y[j]);
	 if (k==1) return 1;
     }	
	if (boxin(a,b.x[0],b.y[0])==1 || boxin(b,a.x[0],a.y[0])==1) return 1; 
	return 0; 
    } 

void ans(box a) {
	int i;
	for (i=0;i<a.n;i++) if (bo[a.b[i]].f==0) { bo[a.b[i]].f=1; ans(bo[a.b[i]]);}
 }
 
    
int main() {
	int i,j,k,h,m,n,a[100];
	while(cin >> m && m>0) {
		for (h=0;h<m;h++) {
		 	cin >> n;
		 	for (i=0;i<n;i++) {
				for (j=0;j<4;j++) cin >> bo[i].x[j] >> bo[i].y[j];
				bo[i].f=bo[i].n=0;
			}
			for (i=0;i<n-1;i++) for (j=i+1;j<n;j++) {
				k=boxcross(bo[i],bo[j]);
				if (k==1) {
					bo[i].b[bo[i].n]=j; bo[j].b[bo[j].n]=i; bo[i].n++; bo[j].n++; } 
	        }
	        a[h]=0;
	        for (i=0;i<n;i++) if (bo[i].f==0) { a[h]++; bo[i].f=1; ans(bo[i]);}
	    }
	    for (i=0;i<m;i++) cout << a[i] << endl;
  }   	
	return 0;
}