#include<bits/stdc++.h>
#define cs const
#define pb push_back
using namespace std;
typedef vector<int> vi;
cs int N = 505;  
int T, n, a[N << 1][N];
cs int mod = 998244353;
void Main() {
	scanf("%d", &n);
	for(int i = 1; i <= n + n; i++) {
		for(int j = 1; j <= n; j++) {
			scanf("%d", &a[i][j]);
//			cout << a[i][j] << ' ';
		}
//		puts("");
	}
	vi ans; 
	int way = 1; 
	set <int> S; 
	for(int i = 1; i <= n + n; i++) S.insert(i);
	while(1) {
		bool stop = 1; 
		for(int i = 1; i <= n; i++) {
			vi c(n + 1);
			for(int j : S) ++ c[a[j][i]];
			while(1) {
				int x = 0; 
				for(int j = 1; j <= n; j++)
				if(c[j] == 1) x = j; 
				if(!x) break;
				for(int j : S) 
				if(a[j][i] == x) {
					ans.pb(j);
					stop = 0; 
					-- c[x];
					for(auto y = S.begin(); y != S.end(); ) {
						if(*y == j) {
							S.erase(y++);
							continue; 
						}
						int l = 1; 
						for(; l <= n; l++)
							if(a[*y][l] == a[j][l]) break; 
						if(l <= n) {
							-- c[a[*y][i]];
							S.erase(y++);
						}
						else ++ y; 
					}
					break;
				}
			}
		}
		if(stop) break;
	}
	vector<vi> xo(n + 1);
	for(int i = 1; i <= n; i++) 
		xo[i].resize(n + 1);
	for(int j : S)
	for(int k = 1; k <= n; k++)
	xo[k][a[j][k]] ^= j; 
	
	vi o(n + n + 1, -1); 
	for(int i : S)
	if(o[i] == -1) {
		way = 2 * way % mod, o[i] = 0; 
		queue<int> q; q.push(i);
		while(!q.empty()) {
			int x = q.front(); q.pop();
			for(int j = 1; j <= n; j++) {
				int v = xo[j][a[x][j]] ^ x; 
				if(~o[v]) continue; 
				q.push(v), o[v] = o[x] ^ 1; 
			}
		}
	}
	for(int i : S)
	if(!o[i]) ans.pb(i);
	cout << way << '\n';
	sort(ans.begin(), ans.end());
	for(int x : ans) cout << x << ' ';
	puts("");
}
int main() {
	#ifdef FSYo
	freopen("1.in", "r", stdin);
	#endif
	cin >> T; 
	while(T--) {
		Main(); 
	}
	return 0; 
} 