#include <iostream>
#include <complex>
#include <vector>
#include <cmath>
using namespace std;
typedef complex<double> P;

double area(vector<P> &p){
	double ans = 0;
	for(int i = 0 ; i+1 < p.size() ; i++)
		ans += p[i].real() * p[i+1].imag() - p[i].imag() * p[i+1].real() ; 
	
	return abs(ans) / 2.0;
}
double tri2(P a,P b, P c){
	a -= c;
	b -= c;
	return abs( a.real() * b.imag() - b.real() * a.imag() );
}

bool in(vector<P> &p,P c){
	p.push_back(p[0]);
	double a = area(p) , b = 0;
	for(int i = 0 ; i+1 < p.size() ; i++){
		b += tri2(p[i],p[i+1],c);
	}
	b = abs(b)/2;
	
	p.pop_back();
	return fabs(a - b) < 1e-9;
}

double dot(P a,P b){
	return a.real() * b.real() + a.imag() * b.imag();
}
double det(P a,P b){
	return a.real() * b.imag() - a.imag() * b.real();
}

bool on_seg(P p1,P p2,P q){
	return abs( det(p1-q,p2-q) ) < 1e-9 && dot((p1-q),(p2-q)) <= 1e-9;
}


P intersection(P p1,P p2,P q1,P q2){
	return p1 + (p2-p1)*( det(q2-q1,q1-p1) / ( det(q2-q1,p2-p1) ) );
}

bool chk(P p1,P p2,P q1,P q2){
	if( abs( det(p2 - p1 , q2 -q1 ) ) < 1e-9 ){
		return on_seg(p2,p1,q2) || on_seg(p2,p1,q1) || on_seg(q1,q2,p1) || on_seg(q1,q2,p2);
	}else{
		P r = intersection(p2,p1,q2,q1);
		return on_seg(p2,p1,r) && on_seg(q2,q1,r);
	}
}

int done[100] = {};
int M;
int dfs(int pos,bool connect[100][100]){
	if( done[pos] ) return 0;
	else done[pos] = true;
	for(int i = 0 ; i < M ; i++){
		if( connect[pos][i] ) dfs(i,connect);
	}
}
int main(){
	int N;
	while(cin >> N && N){
		for(int i = 0 ; i < N ; i++){
			cin >> M;
			vector<P> p[100];
			for(int j = 0 ; j < M ; j++){
				for(int k = 0 ; k < 4 ; k++){
					P a;
					cin >> a.real() >> a.imag();
					p[j].push_back(a);
				}
			}
			bool connect[100][100] = {};
			for(int j = 0 ; j < M ; j++)
				for(int k = 0 ; k < M ; k++){
					for(int l = 0 ; l < 4 ; l++){
						if( in(p[j],p[k][l]) ){
							connect[j][k] = connect[k][j] = true;
						}
					}
				}
			for(int j = 0 ; j < M ; j++)
				for(int k = 0 ; k < M ; k++){
					for(int l = 0 ; l < 4 ; l++){
						for(int m = 0 ; m < 4 ; m++){
							if( chk(p[j][l],p[j][(l+1)%4],p[k][m],p[k][(m+1)%4]) ){
								connect[j][k] = connect[k][j] = true;
							}
						}
					}
				}
			for(int i = 0 ; i < 100 ; i++){
				done[i] = 0;
			}
			int ans = 0;
			for(int i = 0 ; i < M ; i++){
				if(done[i] == 0){
					dfs(i,connect);
					ans++;
				}
			}
			cout << ans << endl;
		}
	}
}