#include<bits/stdc++.h>
using namespace std;

struct Dice{
    array<int,6> face;
    Dice(){
        fill(face.begin(),face.end(),0);
    }
};

bool isValid(Dice x){
    bool res=true;
    int cnt=0;
    for(int i=0;i<6;i++){
        if(x.face[i]==1){
            if(i%3!=0) cnt++;
            if(i>=3) res=!res;
        }
        if(x.face[i]==2){
            if(i%3!=2) cnt++;
            if(i>=3) res=!res;
        }
        if(x.face[i]==3){
            if(i%3!=1) cnt++;
            if(i>=3) res=!res;
        }
    }
    if(cnt==2) res=!res;
    return res;
}
vector<Dice> generate(){
    vector<Dice> res;
    for(int i=1;i<=6;i++){
        for(int j=1;j<=6;j++){
            if(i==j || i+j==7) continue;       
            for(int k=1;k<=6;k++){
                if(k==i || k+i==7) continue;
                if(k==j || k+j==7) continue;
                Dice x;
                x.face[0]=i;
                x.face[3]=7-i;
                x.face[1]=j;
                x.face[4]=7-j;
                x.face[2]=k;
                x.face[5]=7-k;
                if(isValid(x)){
                    res.push_back(x);
                }
            }
        }
    }
    return res;
};
using Face=array<array<int,3>,3>;
using Cube=array<array<array<Dice,3>,3>,3>;
int dx[]={1,0,0,-1,0,0};
int dy[]={0,1,0,0,-1,0};
int dz[]={0,0,1,0,0,-1};
vector<Cube> pred(1);
void init(){
    auto isRangeImpl=[&](int x){
        return 0<=x && x<3;
    };
    auto isRange=[&](int i,int j,int k){
        return isRangeImpl(i) && isRangeImpl(j) && isRangeImpl(k);
    };
    auto isOKCube=[&](const Cube &x,int i,int j,int k){
        for(int dir=0;dir<6;dir++){
            int toi=i+dx[dir],toj=j+dy[dir],tok=k+dz[dir];
            if(!isRange(toi,toj,tok) || !x[toi][toj][tok].face[0]) continue;
            if(x[i][j][k].face[dir]+x[toi][toj][tok].face[(dir+3)%6]!=7) return false;
        }
        return true;
    };
    for(int i=0;i<3;i++)for(int j=0;j<3;j++)for(int k=0;k<3;k++) pred[0][i][j][k]=Dice();
    vector<Dice> dices=generate();
    for(int i=0;i<3;i++){
        for(int j=0;j<3;j++){
            for(int k=0;k<3;k++){
                vector<Cube> next;
                for(Cube &c:pred){
                    for(Dice &d:dices){
                        c[i][j][k]=d;
                        if(isOKCube(c,i,j,k)){
                            next.push_back(c);
                        }
                    }
                }
                pred=next;
            }
        }
    }
}
void solve(){
    Face t,f;
    for(int i=0;i<3;i++){
        for(int j=0;j<3;j++){
            cin>>t[i][j];
        }
    }
    for(int i=0;i<3;i++){
        for(int j=0;j<3;j++){
            cin>>f[i][j];
        }
    }
    set<int> ans;
    for(auto &c:pred){
        bool isok=true;
        int sum=0;
        for(int i=0;i<3;i++){
            for(int j=0;j<3;j++){
                isok=isok&&(t[2-i][j]==0 || t[2-i][j]==c[j][i][0].face[5]);
                isok=isok&&(f[i][j]==0 || f[i][j]==c[j][0][i].face[4]);
                sum+=c[2][i][j].face[0];
            }
        }
        if(isok) ans.insert(sum);
    }
    if(ans.size()==0) cout<<0<<endl;
    else{
        vector<int> res(ans.begin(),ans.end());
        for(int i=0;i<res.size();i++){
            cout<<res[i]<<(i+1==res.size() ? "\n" : " ");
        }
    }
    return;
}
int main(){
    init();
    int t;
    cin>>t;
    while(t--){
        solve();
    }    
    return 0;
}


Measured memory_bytes: 52468