#include<bits/stdc++.h>
using namespace std;
#define DONTSYNC ios_base::sync_with_stdio(false);   cin.tie(NULL); cout.tie(NULL) //dont use stdio with iostream functions //input and output are out of order now!
#define TEST unsigned long long T; cin>>T; while(T--)  //loop over each testcase
#define endl "\n"
#define fori(a,start,end) for(int a=start;a<end;a++)
#define forl(a,start,end) for(long long a=start;a<end;a++)
#define fi first
#define se second
#define all(x) (x).begin(), (x).end()
typedef long long     ll;
typedef long double   ld;
typedef pair<int,int> pii;
typedef pair<ll,ll>   pll;
typedef vector<int>   vi;
typedef vector<ll>    vl;
typedef vector<pii>   vii;
typedef vector<pll>   vll;
typedef vector<vi>    vvi;
typedef vector<vl>    vvl;
const double PI = acos(-1);
void rem_dup(int orgind,vvi &org,vi &vis,vvi &col_sum,list<pii> &l,int &cnt){
    int n=org[0].size();
    fori(ind,0,2*n){
        if(ind==orgind || vis[ind]) continue;
        fori(col,0,n) if(org[ind][col]==org[orgind][col]) vis[ind]=2;
        if(vis[ind]){ 
            fori(col,0,n){
                col_sum[col][org[ind][col]]--;
                if(col_sum[col][org[ind][col]]==1){
                    l.push_back({col,org[ind][col]});
                }
            }
            cnt++;
        }
    }
}
ll mod=998244353;
void print1d(vi &arr){
    int n=arr.size();
    fori(i,0,n){
        cout<<arr[i]<<' ';
    }cout<<endl;
}
void print2d(vvi &arr){
    int n=arr.size(),m=arr[0].size();
    fori(i,0,n){
        fori(j,0,m) cout<<arr[i][j]+(n!=m)?1:0<<' ';
        cout<<endl;
    }
}
void solve(){
    int n; cin>>n;
    vvi org(2*n,vi(n)),col_sum(n,vi(n,0));
    vi vis(2*n,0);
    fori(i,0,2*n){
        fori(j,0,n){
            cin>>org[i][j]; org[i][j]--;
            col_sum[j][org[i][j]]++;
        }
    }
    list<pii> l;
    fori(col,0,n){
        fori(val,0,n){
            if(col_sum[col][val]==1) l.push_back({col,val});
        }
    }
    // // deb
    // cout<<"vis: ";print1d(vis);
    // //
    int cnt=0; ll res=1;
    while(true){
        if(l.size()){
            auto [col,val]=l.front(); l.pop_front();
            fori(i,0,2*n){
                if(org[i][col]==val && !vis[i] && col_sum[col][val]==1){
                    // add orgind
                    vis[i]=1; cnt++;
                    fori(j,0,n) col_sum[j][org[i][j]]=0;
                    rem_dup(i,org,vis,col_sum,l,cnt);
                    break;
                }
            }
        }else if(cnt<2*n){
            fori(ind,0,2*n){
                if(vis[ind]) continue;
                vis[ind]=1; cnt++;
                res=res*2%mod;
                fori(j,0,n) col_sum[j][org[ind][j]]=0;
                rem_dup(ind,org,vis,col_sum,l,cnt);
                break;
            }
        }else break;
    }
    // // deb
    // cout<<"vis: ";print1d(vis);
    // //
    cout<<res<<endl;
    fori(ind,0,2*n){
        if(vis[ind]!=1) continue;
        cout<<ind+1<<' ';
    }cout<<endl;
}

int main()
{
    DONTSYNC;
    TEST
    solve();
    return 0;
}
