#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int *X1 = new int [4];//{0,0,0};
int *Y1 = new int [4];//{0,0,0};
int *Z1 = new int [4];//{0,0,0};
int *X2 = new int [4];//{0,0,0};
int *Y2 = new int [4];//{0,0,0};
int *Z2 = new int [4];//{0,0,0};
double eps =0.000000001;
int solve4(int x1,int y1,int z1, int x2, int y2,int z2){
	// нужно определить проекцию точки 2 на вектор 1, попадает ли она
	// для этого решаем квадратное уравнение
	int d1 = x1*x2 + y1*y2 + z1*z2;
	int d2 = x1*x1 + y1*y1 + z1*z1;
	if(d1 == 0)
		return 1;
	if(d1 < 0 )
		return 0;
	if(d1 <= d2)
		return 1;
	
	return 0;
}
int solve3(int *x,int *y, int *z, int pointx, int pointy, int pointz){
	int s = 0;
	s += solve4(x[1], y[1], z[1], pointx, pointy, pointz);
	s += solve4(x[2], y[2], z[2], pointx, pointy, pointz);
	s += solve4(x[3], y[3], z[3], pointx, pointy, pointz);
	if(s == 3){
		return 1;
	}
	return 0;
}
int intersect(double ax1, double ay1, double ax2, double ay2, double bx1, double by1, double bx2, double by2){
   double v1=(bx2-bx1)*(ay1-by1)-(by2-by1)*(ax1-bx1);
   double v2=(bx2-bx1)*(ay2-by1)-(by2-by1)*(ax2-bx1);
   double v3=(ax2-ax1)*(by1-ay1)-(ay2-ay1)*(bx1-ax1);
   double v4=(ax2-ax1)*(by2-ay1)-(ay2-ay1)*(bx2-ax1);
   if((v1*v2<0) && (v3*v4<0)){
	   return 1;
   }
	return 0;
}

int solve4(int *x,int *y, int *z, int pointx, int pointy, int pointz, int pointx1, int pointy1, int pointz1){
	double l1 = sqrt(x[1]*x[1] + y[1]*y[1]+z[1]*z[1]);
	double l2 = sqrt(x[2]*x[2] + y[2]*y[2]+z[2]*z[2]);
	double l3 = sqrt(x[3]*x[3] + y[3]*y[3]+z[3]*z[3]);
	double p1x = (x[1]*pointx + y[1]*pointy + z[1]*pointz)/(l1);
	double p1y = (x[2]*pointx + y[2]*pointy + z[2]*pointz)/(l2);
	double p1z = (x[3]*pointx + y[3]*pointy + z[3]*pointz)/(l3);
	double p2x = (x[1]*pointx1 + y[1]*pointy1 + z[1]*pointz1)/(l1);
	double p2y = (x[2]*pointx1 + y[2]*pointy1 + z[2]*pointz1)/(l2);
	double p2z = (x[3]*pointx1 + y[3]*pointy1 + z[3]*pointz1)/(l3);

	// p1x p1y p1z и p2x p2y p2z это точки ребра второго парал. в системе координат первого
	// уравнение прямой проходящей через эти две точки будет
	// p1x+(p2x-p1x)*k, p1y + (p2y-p1y)*k, p1z +(p2z-p1z)*k
	//проверяем пересечение граней
	// грань x = 0
	double A = 0;
	double k = 0;
	// плоскости yz (x = 0 и x=l1)
	if(fabs(p2x-p1x) < eps){
		// прямая перпендикулярна оси х, то есть паралельна нашим плоскостям, в это случае пересечение будет только если ребро в плоскости грани
		if(fabs(p2x) < eps || fabs(p2x-l1) < eps){
			//проверяем пересечение ребра второго парал. и четырх ребер первого
			if(intersect(p1y, p1z, p2y, p2z, 0, 0, l2, 0))
				return 1;
			if(intersect(p1y, p1z, p2y, p2z, 0, 0, 0, l3))
				return 1;
			if(intersect(p1y, p1z, p2y, p2z, 0, l3, l2, l3))
				return 1;	
			if(intersect(p1y, p1z, p2y, p2z, l2, 0, l2, l3))
				return 1;
		}
	}else{
		A = 0;
		k = (A - p1x)/(p2x - p1x);
		if(k>-eps && k < 1+eps){
			// точка пересечения находится на ребре, проверяем попадает ли она на грань парал.
			double ty = p1y + (p2y-p1y)*k;
			double tz = p1z + (p2z-p1z)*k;
			if(ty>-eps && ty<l2+eps){
				if(tz>-eps && tz<l3+eps){
					return 1;
				}
			}
		}
		A = l1;
		k = (A - p1x)/(p2x - p1x);
		if(k>-eps && k < 1+eps){
			// точка пересечения находится на ребре, проверяем попадает ли она на грань парал.
			double ty = p1y + (p2y-p1y)*k;
			double tz = p1z + (p2z-p1z)*k;
			if(ty>-eps && ty<l2+eps){
				if(tz>-eps && tz<l3+eps){
					return 1;
				}
			}
		}
	}
	// плоскости xy (z = 0 и z=l3)
	if(fabs(p2z-p1z) < eps){
		// прямая перпендикулярна оси z, то есть паралельна нашим плоскостям, в это случае будет пересечение ребер
		if(fabs(p2z) < eps || fabs(p2z-l3) < eps){
			//проверяем пересечение ребра второго парал. и четырх ребер первого
			if(intersect(p1x, p1y, p2x, p2y, 0, 0, l1, 0))
				return 1;
			if(intersect(p1x, p1y, p2x, p2y, 0, 0, 0, l2))
				return 1;
			if(intersect(p1x, p1y, p2x, p2y, 0, l2, l1, l2))
				return 1;
			if(intersect(p1x, p1y, p2x, p2y, l1, 0, l1, l2))
				return 1;
		}
		
	}else{
		A = 0;
		k = (A - p1z)/(p2z - p1z);
		if(k>-eps && k < 1+eps){
			// точка пересечения находится на ребре, проверяем попадает ли она на грань парал.
			double ty = p1y + (p2y-p1y)*k;
			double tx = p1x + (p2x-p1x)*k;
			if(ty>-eps && ty<l2+eps){
				if(tx>-eps && tx<l1+eps){
					return 1;
				}
			}
		}
		A = l3;
		k = (A - p1z)/(p2z - p1z);
		if(k>-eps && k < 1+eps){
			// точка пересечения находится на ребре, проверяем попадает ли она на грань парал.
			double ty = p1y + (p2y-p1y)*k;
			double tx = p1x + (p2x-p1x)*k;
			if(ty>-eps && ty<l2+eps){
				if(tx>-eps && tx<l1+eps){
					return 1;
				}
			}
		}
	}
	// плоскости xz (y = 0 и y=l2)
	if(fabs(p2y-p1y) < eps){
		// прямая перпендикулярна оси y, то есть паралельна нашим плоскостям, в это случае будет пересечение ребер
		if(fabs(p2y) < eps || fabs(p2y-l2) < eps){
			//проверяем пересечение ребра второго парал. и четырх ребер первого
			if(intersect(p1x, p1z, p2x, p2z, 0, 0, l1, 0))
				return 1;
			if(intersect(p1x, p1z, p2x, p2z, 0, 0, 0, l3))
				return 1;
			if(intersect(p1x, p1z, p2x, p2z, 0, l3, l1, l3))
				return 1;
			if(intersect(p1x, p1z, p2x, p2z, l1, 0, l1, l3))
				return 1;
		}
	}else{
		A = 0;
		k = (A - p1y)/(p2y - p1y);
		if(k>-eps && k < 1+eps){
			// точка пересечения находится на ребре, проверяем попадает ли она на грань парал.
			double tz = p1z + (p2z-p1z)*k;
			double tx = p1x + (p2x-p1x)*k;
			if(tz>-eps && tz<l3+eps){
				if(tx>-eps && tx<l1+eps){
					return 1;
				}
			}
		}
		A = l2;
		k = (A - p1y)/(p2y - p1y);
		if(k>-eps && k < 1+eps){
			// точка пересечения находится на ребре, проверяем попадает ли она на грань парал.
			double tz = p1z + (p2z-p1z)*k;
			double tx = p1x + (p2x-p1x)*k;
			if(tz>-eps && tz<l3+eps){
				if(tx>-eps && tx<l1+eps){
					return 1;
				}
			}
		}
	}

	return 0;
}
int solve2(int *x1,int *y1, int *z1, int *x2, int *y2, int *z2){
	// смещаем начало второго куба относительно начала координат на положение первого куба
	int st_x = x2[0] - x1[0];
	int st_y = y2[0] - y1[0];
	int st_z = z2[0] - z1[0];
	// теперь для каждой точки второго куба надо найти проекцию этой точки на все грани первого куба
	int point2x[8], point2y[8], point2z[8];
	//point 0
	point2x[0] = st_x;
	point2y[0] = st_y;
	point2z[0] = st_z;
	//point 1
	point2x[1] = st_x + x2[1];
	point2y[1] = st_y + y2[1];
	point2z[1] = st_z + z2[1];
	//point 2
	point2x[2] = st_x + x2[2];
	point2y[2] = st_y + y2[2];
	point2z[2] = st_z + z2[2];
	//point 3
	point2x[3] = st_x + x2[3];
	point2y[3] = st_y + y2[3];
	point2z[3] = st_z + z2[3];
	//point 4
	point2x[4] = st_x + x2[1] + x2[2];
	point2y[4] = st_y + y2[1] + y2[2];
	point2z[4] = st_z + z2[1] + z2[2];
	//point 5
	point2x[5] = st_x + x2[1] + x2[3];
	point2y[5] = st_y + y2[1] + y2[3];
	point2z[5] = st_z + z2[1] + z2[3];
	//point 6
	point2x[6] = st_x + x2[3] + x2[2];
	point2y[6] = st_y + y2[3] + y2[2];
	point2z[6] = st_z + z2[3] + z2[2];
	//point 7
	point2x[7] = st_x + x2[1] + x2[2] + x2[3];
	point2y[7] = st_y + y2[1] + y2[2] + y2[3];
	point2z[7] = st_z + z2[1] + z2[2] + z2[3];

	for(int i = 0; i <= 7; i++){
		if(solve3(x1,y1,z1, point2x[i], point2y[i], point2z[i])){
			return 1;
		}
	}
	int pointFrom[] = {0, 0, 0, 1, 3, 2, 2, 1, 6, 6, 4, 7};
	int pointTo[]   = {1, 3, 2, 4, 5, 4, 5, 6, 3, 7, 7, 5};
	for(int j = 0 ; j < 12; j++){
		int k1 = pointFrom[j];
		int k2 = pointTo[j];
		if(solve4(x1,y1,z1,point2x[k1], point2y[k1], point2z[k1], point2x[k2], point2y[k2], point2z[k2])){
			// это ребро пересекает грань
			return 1;
		}
	}
	return 0;
}

int solve(){
	// read input
	int i = 0;
	for( i = 0; i < 4;i++){
		scanf("%d%d%d",&X1[i], &Y1[i], &Z1[i]);
	}
	for( i = 0; i < 4;i++){
		scanf("%d%d%d",&X2[i], &Y2[i], &Z2[i]);
	}
	if(solve2(X1, Y1, Z1, X2, Y2, Z2)){
		//точка второго куба внутри первого
		return 1;
	}
	if(solve2(X2, Y2, Z2, X1, Y1, Z1)){
		// точка первого куба внутри второго
		return 1;
	}
	return 0;
}
int main()
{
	freopen("crossing.in","r", stdin);
	//freopen("crossing.out","w", stdout);
	int N = 0;
	scanf("%d", &N);
	for(int i = 0; i < N; i++){
		if(solve()){
			printf("YES\n");
		}else{
			printf("NO\n");
		}
	}
	return 0;
}