#include <stdio.h>
#include <memory.h>
const int N=102;
const int nei[6][3]={ { 0, 0, 1},
{ 0, 0,-1},
{ 1, 0, 0},
{-1, 0, 0},
{ 0, 1, 0},
{ 0,-1, 0} };
bool cube[N][N][N];
int minb,maxb;
bool checkrange(int p)
{
return (p>=minb && p<=maxb);
}
void fill( int x, int y, int z )
{
for (int i=0; i<6; ++i)
{
int xx,yy,zz;
xx=x+nei[i][0];
yy=y+nei[i][1];
zz=z+nei[i][2];
if ( !( checkrange(xx) && checkrange(yy) && checkrange(zz) ) )
continue;
if ( cube[xx][yy][zz]== false )
{
cube[xx][yy][zz]=true;
fill(xx,yy,zz);
}
}
}
int main(int argc, char** argv)
{
int t, m, x, y, z, ans;
scanf("%d", &t );
while ( t-- )
{
memset(cube, false, sizeof( cube ) );
scanf("%d" , &m );
minb=100;
maxb=1;
for (int i=0; i<m; ++i)
{
scanf("%d%d%d", &x, &y, &z);
if ( x>maxb) maxb=x;
if ( y>maxb) maxb=y;
if ( z>maxb) maxb=z;
if ( x<minb) minb=x;
if ( y<minb) minb=y;
if ( z<minb) minb=z;
cube[x][y][z]=true;
}
--minb;
++maxb;
ans=0;
for (int xx=minb; xx<=maxb; ++xx)
for (int yy=minb; yy<=maxb; ++yy)
for (int zz=minb; zz<=maxb; ++zz)
if ( cube[xx][yy][zz] == false )
{
cube[xx][yy][zz]=true;
++ans;
fill(xx, yy, zz);
}
printf("%d\n", ans-1);
}
return 0;
}