#include <algorithm>
#include <bitset>
#include <cmath>
#include <complex>
#include <cstdio>
#include <iostream>
#include <map>
#include <numeric>
#include <queue>
#include <random>
#include <set>
#include <stack>
#include <string>
#include <sys/types.h>
#include <unistd.h>
#include <unordered_map>
#include <unordered_set>
#include <vector>

#pragma region macros
#define _overload(_1, _2, _3, name, ...) name
#define _rep(i, n) _range(i, 0, n)
#define _range(i, a, b) for (int i = int(a); i < int(b); ++i)
#define rep(...) _overload(__VA_ARGS__, _range, _rep, )(__VA_ARGS__)
#define _rrep(i, n) _rrange(i, n, 0)
#define _rrange(i, a, b) for (int i = int(a) - 1; i >= int(b); --i)
#define rrep(...) _overload(__VA_ARGS__, _rrange, _rrep, )(__VA_ARGS__)
#pragma endregion macros

using namespace std;

template <class T> bool chmax(T &a, const T &b) {
    return (a < b) ? (a = b, 1) : 0;
}
template <class T> bool chmin(T &a, const T &b) {
    return (b < a) ? (a = b, 1) : 0;
}

using ll    = long long;
using R     = long double;
const R EPS = 1e-9L;  // [-1000,1000]->EPS=1e-8 [-10000,10000]->EPS=1e-7
inline int sgn(const R &r) {
    return (r > EPS) - (r < -EPS);
}
inline R sq(R x) {
    return sqrt(max(x, 0.0L));
}

const int dx[8] = {1, 0, -1, 0, 1, -1, -1, 1};
const int dy[8] = {0, 1, 0, -1, 1, 1, -1, -1};

const pid_t pid = getpid();

// [column][number]
set<int> cand[510][510];
const ll mod = 998244353LL;

int main(void) {
    int t;
    cin >> t;
    rep(loop, t) {
        int n;
        cin >> n;
        vector<vector<int>> ary(2 * n);

        rep(i, n) rep(j, n) {
            cand[i][j].clear();
        }

        rep(i, 2 * n) {
            ary[i] = vector<int>(n);
            rep(j, n) {
                cin >> ary[i][j];
                ary[i][j]--;
                cand[j][ary[i][j]].insert(i);
            }
        }

        ll cnt = 1LL;
        vector<int> ans;

        vector<int> alive(2 * n, 1);

        while (1) {
            int tar = -1;
            rep(i, 2 * n) {
                if (alive[i]) {
                    rep(j, n) {
                        if (cand[j][ary[i][j]].size() == 1) {
                            tar = i;
                            break;
                        }
                    }
                }

                if (tar >= 0) {
                    break;
                }
            }

            if (tar == -1) {
                rep(i, 2 * n) {
                    if (alive[i]) {
                        tar = i;
                        break;
                    }
                }

                if (tar >= 0) {
                    cnt = 2LL * cnt % mod;
                }
            }

            if (tar == -1) {
                break;
            }

            alive[tar] = 0;
            ans.push_back(tar);
            set<int> del_idx;

            rep(j, n) {
                cand[j][ary[tar][j]].erase(tar);
                for (auto &idx: cand[j][ary[tar][j]]) {
                    del_idx.insert(idx);
                }
            }

            for (auto &idx: del_idx) {
                if (alive[idx]) {
                    alive[idx] = 0;
                    rep(j, n) {
                        cand[j][ary[idx][j]].erase(idx);
                    }
                }
            }
        }

        cout << cnt << endl;


        const int m = ans.size();
        rep(i, m) {
            cout << (i ? " " : "") << ans[i] + 1;
        }
        cout << endl;
    }
    return 0;
}