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

const long long MOD = 998244353;

int a[1005][505];
vector<int> pos[505][505];
bool removed[505];

void remove1(int x, int n, int layerNum = 0){
    if(removed[x]){return;}
    removed[x] = true;

    vector<int> toRemove;
    for(int j = 1; j <= n; j ++){
        auto it = find(pos[j][a[x][j]].begin(), pos[j][a[x][j]].end(), x);
        if(layerNum == 0){
            if(it != pos[j][a[x][j]].end()){
                for(int k: pos[j][a[x][j]]){
                    if(k != x){
                        toRemove.push_back(k);
                    }
                }
                pos[j][a[x][j]] = vector<int>();
            }
        }else{
            if(it != pos[j][a[x][j]].end()){
                pos[j][a[x][j]].erase(it);
            }
        }
    }

    for(int k: toRemove){
        remove1(k, n, 1);
    }
}

void printPosState(int n){
    for(int i = 1; i <= n; i ++){
        for(int j = 1; j <= n; j ++){
            printf("(%d, %d): ", i, j);

            for(int k: pos[i][j]){
                printf("%d ", k);
            }

            printf("\n");
        }
    }
}

int main(){
    int t;
    scanf("%d", &t);

    while(t --){
        int n;
        scanf("%d", &n);

        memset(removed, false, sizeof(removed));

        for(int i = 1; i <= n; i ++){
            for(int j = 1; j <= n; j ++){
                pos[i][j] = vector<int>();
            }
        }

        for(int i = 1; i <= 2*n; i ++){
            for(int j = 1; j <= n; j ++){
                scanf("%d", &a[i][j]);
                pos[j][a[i][j]].push_back(i);
            }
        }

        vector<int> res;

        //printPosState(n);

        int cnt = 0;
        while(1){
            bool found = false;
            for(int i = 1; i <= n; i ++){
                for(int j = 1; j <= n; j ++){
                    if((int)pos[i][j].size() == 1){
                        int x = pos[i][j][0];
                        remove1(x, n);
                        //printf("%d removed\n\n", x);
                        //printPosState(n);
                        res.push_back(x);
                        found = true;
                        break;
                    }
                }
                if(found){break;}
            }
            if(!found){
                cnt ++;
                for(int i = 1; i <= n; i ++){
                    for(int j = 1; j <= n; j ++){
                        if((int)pos[i][j].size() == 2){
                            int x = pos[i][j][0];
                            remove1(x, n);
                            //printf("%d removed\n\n", x);
                            //printPosState(n);
                            res.push_back(x);
                            found = true;
                            break;
                        }
                    }
                    if(found){break;}
                }
            }

            if(!found){break;}
        }

        //printf("cnt=%d\n", cnt);

        long long ans = 1;
        for(int i = 1; i < cnt; i ++){
            ans = (ans+ans)%MOD;
        }

        printf("%lld\n", ans);
        for(int x: res){
            printf("%d ", x);
        }
        printf("\n");
    }

    return 0;
}
