#include <bits/stdc++.h>
//#define endl '\n'
#define lose {printf("NO\n");return;}
#define win {printf("YES\n");return;}
#define all(A) (A).begin(),(A).end()
#define FOR(I, A, B) for (int I = (A); I <= (B); ++I)
#define PER(I, A, B) for (int I = (A); I >= (B); --I)
#define DB(A) cout<<(A)<<endl
#define lson k*2
#define rson k*2+1
#define fi first
#define se second
#define PB push_back
#define Pair pair<int,int>
#define MP make_pair
#define ll long long
#define ull unsigned long long
#define int ll
using namespace std;
#define DB1(args...) do { cout << #args << " : "; dbg(args); } while (0)
void dbg() { std::cout << "  #\n"; }
template<typename T, typename...Args>
void dbg(T a, Args...args) { std::cout << a << ' '; dbg(args...); }
template <typename T> void inline read(T &x) {
    int f = 1; x = 0; char s = getchar();
    while (s < '0' || s > '9') { if (s == '-') f = -1; s = getchar(); }
    while (s <= '9' && s >= '0') x = x * 10 + (s ^ 48), s = getchar();
    x *= f;
}

template <typename T> void print(T x) {
    if (x < 0) { putchar('-'); print(x); return ; }
    if (x >= 10) print(x / 10);
    putchar((x % 10) + '0');
}

//var
const int maxn=1000+10;
const int MAX=500;
const int inf=0x3f3f3f3f;
const int mod=998244353;
//head
int n,m;
int a[maxn][maxn];
bool f[maxn];
int b[maxn][maxn];
void solve()
{
    read(n);
    FOR(i,1,2*n)
    {
        f[i]=0;
        FOR(j,1,n)
        {
            read(a[i][j]);
        }
    }
    ll ans=1;//total answer
    vector<int>an;//total ways
    an.clear();


    while (true)
    {
        FOR(i,1,2*n)
            FOR(j,1,n) b[j][a[i][j]]=0;
        FOR(i,1,2*n) if (!f[i])
                FOR(j,1,n) b[j][a[i][j]]++;
        //initialize b

        int uniq=0;
        FOR(i,1,n*2) if (!f[i]&&!uniq)
            {
                FOR(j,1,n) if (b[j][a[i][j]]==1)
                    {
                        uniq=i;
                        break;
                    }
            }else if (uniq) break;
        // find an unique array





//        if (uniq==0)
//        {
//            FOR(i,1,2*n) if (!f[i])
//                {
//                    uniq=i;
//                    ans=ans*2%mod;
//                    break;
//                }
//        }
//        if (uniq!=0)
//        {
//            f[uniq]=1;
//            an.PB(uniq);
//
//            FOR(i,1,2*n) if (!f[i])
//            {
//                bool isok=1;
//                FOR(j,1,n) if (a[i][j]==a[uniq][j])
//                {
//                    f[i]=1;
//                    isok=0;
//                    break;
//                }
//                if (!isok) break;
//            }
//
////    //erase arrays that related to the unique arrays
//        }
//        if (an.size()==n) break;
        if (uniq!=0)
        {
            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%mod;
        }

        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 (auto ele:an)
    {
        printf("%lld ",ele);
    }
    printf("\n");


}
signed main()
{
    // freopen("read.txt", "r", stdin);
    // freopen("ans.txt", "w", stdout);
    int TestCase = 1;
    cin>>TestCase;
    while (TestCase--)
    {
        solve();
    }
}
