#include <bits/stdc++.h>
using namespace std;
static inline int read_bit() {
char ch;
while (cin >> ch) {
if (ch == '0' || ch == '1') return ch - '0';
}
return 0; // 不会到这里
}
int main() {
int T;
cin >> T;
while (T--) {
int n;
cin >> n;
vector<vector<int>> A(n, vector<int>(n));
vector<vector<int>> B(n, vector<int>(n));
for (int i = 0; i < n; ++i)
for (int j = 0; j < n; ++j)
A[i][j] = read_bit();
for (int i = 0; i < n; ++i)
for (int j = 0; j < n; ++j)
B[i][j] = read_bit();
// D = A xor B
vector<vector<int>> D(n, vector<int>(n));
for (int i = 0; i < n; ++i)
for (int j = 0; j < n; ++j)
D[i][j] = A[i][j] ^ B[i][j];
// 可行性检查:D[i][j] == D[i][0] ^ D[0][j] ^ D[0][0]
bool ok = true;
for (int i = 0; i < n && ok; ++i)
for (int j = 0; j < n; ++j)
if ((D[i][0] ^ D[0][j] ^ D[0][0]) != D[i][j]) {
ok = false;
break;
}
if (!ok) {
cout << -1 << '\n';
continue;
}
// 构造 r,c 并求最少操作
vector<int> r(n), c(n);
for (int i = 0; i < n; ++i) r[i] = D[i][0];
for (int j = 0; j < n; ++j) c[j] = D[0][j] ^ D[0][0];
int sr = accumulate(r.begin(), r.end(), 0);
int sc = accumulate(c.begin(), c.end(), 0);
int ans = min(sr + sc, 2 * n - (sr + sc));
cout << ans << '\n';
}
return 0;
}