import java.util.*;
import java.io.*;
public class Solution {
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int T= Integer.parseInt(br.readLine()); // 테스트케이스
for(int tc=1; tc<=T; tc++) {
int arr[][] = new int[9][9];
for(int i=0; i<9; i++) {
StringTokenizer st = new StringTokenizer(br.readLine()," ");
for(int j=0; j<9; j++) {
arr[i][j] = Integer.parseInt(st.nextToken());
}
}
// 가로줄
// boolean 형 배열을 이용하여 각줄의 수가 있을 경우 true로 초기화
// false값이 있는 경우 조건위배 garo를 0으로 초기화
int garo = 1;
for(int i=0; i<9; i++) {
boolean check[] = new boolean[10];
for(int j=0; j<9; j++) {
check[arr[i][j]] = true;
}
for(int k=1; k<10; k++) {
if(check[k] == false) {
garo = 0;
break;
}
}
}
// 세로줄
// 가로줄과 똑같이
int sero = 1;
for(int i=0; i<9; i++) {
boolean check[] = new boolean[10];
for(int j=0; j<9; j++) {
check[arr[j][i]] = true;
}
for(int k=1; k<10; k++) {
if(check[k] == false) {
sero = 0;
break;
}
}
}
// 격자
// 가로줄과 똑같이
int grid=1;
for(int a=0; a<=6; a+=3) {
for(int b=0; b<=6; b+=3) {
boolean check[] = new boolean[10];
for(int i=0; i<3; i++) {
for(int j=0; j<3; j++) {
check[arr[i+a][j+b]] = true;
}
}
for(int k=1; k<10; k++) {
if(check[k] == false) {
grid = 0;
break;
}
}
}
}
int ans=0;
if(garo*sero*grid==1) {
ans=1;
}
// sb에 저장
sb.append("#" + tc +' ' + ans + "\n");
}
System.out.println(sb);
}
}