#include <bits/stdc++.h>

inline int read()
{
	int data = 0, w = 1; char ch = getchar();
	while (ch != '-' && !std::isdigit(ch)) ch = getchar();
	if (ch == '-') w = -1, ch = getchar();
	while (std::isdigit(ch)) data = data * 10 + (ch ^ 48), ch = getchar();
	return data * w;
}

constexpr int N(1005), Mod(998244353);
inline int upd(const int &x) { return x + (x >> 31 & Mod); }
std::vector<int> G[N];
int T, n, a[N][N], c[N][N], col[N];
void dfs(int x, int c) { col[x] = c; for (auto i : G[x]) if (!col[i]) dfs(i, 3 - c); }

void solve()
{
	n = read(), std::memset(col + 1, 0, n << 3);
	for (int i = 1; i <= n; i++) std::memset(c[i] + 1, 0, n << 2);
	for (int i = 1; i <= (n << 1); i++) G[i].clear();
	for (int i = 1; i <= (n << 1); i++)
		for (int j = 1; j <= n; j++) a[i][j] = read(), ++c[j][a[i][j]];
	for (int i = 1; i <= (n << 1); i++) for (int j = i + 1; j <= (n << 1); j++)
		for (int k = 1; k <= n; k++) if (a[i][k] == a[j][k]) { G[i].push_back(j), G[j].push_back(i); break; }
	while (1)
	{
		int x = 0, y = 0;
		for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++) if (c[i][j] == 1) { x = i, y = j; break; }
		if (!x && !y) break;
		for (int i = 1; i <= (n << 1); i++) if (!col[i] && a[i][x] == y)
		{
			for (int j = 1; j <= n; j++) --c[j][a[i][j]];
			for (auto j : G[i])
			{
				for (int k = 1; k <= n; k++) --c[k][a[j][k]];
				for (auto k : G[j]) if (k != i)
					G[k].erase(std::find(G[k].begin(), G[k].end(), j));
				col[j] = 2, G[j].clear();
			}
			col[i] = 1, G[i].clear(); break;
		}
	}
	int ans = 1;
	for (int i = 1; i <= (n << 1); i++) if (!col[i]) dfs(i, 1), ans = upd((ans << 1) - Mod);
	printf("%d\n", ans);
	for (int i = 1; i <= (n << 1); i++) if (col[i] == 1) printf("%d ", i);
}

int main()
{
	for (T = read(); T--; solve(), puts(""));
	return 0;
}