#include <bits/stdc++.h>
using namespace std;
const int N = 305;
int a[N][N];
int prefix[N];
void solve() {
cout << "---"<<endl;
int n;
cin >> n;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
cin >> a[i][j];
}
}
vector<pair<int, int>> intervals;
vector<bool> used(n + 1, false);
for (int i = 0; i < n; i++) {
prefix[0] = 0;
for (int j = 0; j < n; j++) {
prefix[j + 1] = prefix[j];
prefix[j + 1] += a[i][j];
}
// binary search through prefix sum
int l = 0, r = n - 1;
if (i) r = n - 2;
while (l < r) {
int m = l + (r - l) / 2;
int v = prefix[n] - prefix[m + 1];
if (v < i) {
r = m - 1;
} else if (v > i) {
l = m + 1;
} else {
// find first position to the right
r = m;
while (r < n && a[r] == 0) r++;
r--;
break;
}
}
if (l < r) {
cout << i << endl;
return;
}
else {
if (l == r) {
if (used[l]) {
cout << i << endl;
return;
} else {
used[l] = true;
}
}
intervals.push_back({l, r});
}
}
int first_free = 0;
for (int i = 0; i < n; i++) {
if (!used[i]) {
first_free = i;
break;
}
}
cout << "intervals: " << endl;
for (int i = 0; i < intervals.size(); i++) {
cout << intervals[i].first << " " << intervals[i].second << endl;
}
for (int i = 0; i < intervals.size(); i++) {
if (intervals[i].first == intervals[i].second) continue;
if (intervals[i].first > first_free) {
int k = intervals[i].first;
while (k <= intervals[i].second && used[k]) {
k++;
}
if (k > intervals[i].second) {
cout << i << endl;
return;
}
else {
used[k] = true;
}
} else {
if (first_free > intervals[i].second) {
cout << i << endl;
return;
} else {
used[first_free] = true;
while (first_free < n && used[first_free]) first_free++;
}
}
}
cout << n << endl;
}
int main() {
int t;
cin >> t;
while (t--) solve();
}