# include <bits/stdc++.h>
# define int long long
using namespace std;
const int N=505;
const int mo=998244353;
int a[2*N][N],b[N][N];
bool f[2*N];
int Pow(int x,int n) {
    int ans=1;
    while (n) {
        if (n&1) ans=ans*x%mo;
        x=x*x%mo;
        n>>=1;
    }
    return ans;
}
vector<int>an;
signed main() {
    int t; scanf("%lld",&t);
    while (t--) {
        an.clear();
        long long ans=1ll;
        int n; scanf("%lld",&n);
        for (int i=1;i<=2*n;i++)
            for (int j=1;j<=n;j++)
                scanf("%lld",&a[i][j]);
        int tot=0;
        for (int i=1;i<=2*n;i++) f[i]=false;


        while (true) {
            for (int i=1;i<=n;i++)
                for (int j=1;j<=n;j++)
                    b[i][j]=0;
            for (int i=1;i<=2*n;i++) if (!f[i]) {
                    for (int j=1;j<=n;j++)
                        b[j][a[i][j]]++;
                }



            bool cc; int uniq;
            for (int i=1;i<=2*n;i++) if (!f[i]) {
                    cc=false;
                    for (int j=1;j<=n;j++) if (b[j][a[i][j]]==1) {
                            cc=true; uniq=i; break;
                        }
                    if (cc) break;
                }

            if (cc)
            {
                an.push_back(uniq);
            }
            else {
                for (int i=1;i<=2*n;i++) if (!f[i]) {
                        uniq=i; break;
                    }
                an.push_back(uniq);
                ans=ans*2ll%mo;
            }
            for (int i=1;i<=2*n;i++) if (!f[i]) {
                    bool flag=true;
                    for (int j=1;j<=n;j++) if (a[i][j]==a[uniq][j]) {
                            flag=false; break;
                        }
                    if (!flag) f[i]=true;
                }
            if (an.size()==n) break;
        }
        printf("%lld\n",ans);
        for (int i=0;i<an.size();i++) printf("%lld ",an[i]);
        puts("");
    }
    return 0;
} 