#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
#include<algorithm>
#include<cmath>
#include<map>
using namespace std;

int ans, n, m;
int a[52][52];

int modify(int x, int y, int dx, int dy, int delta)
{
	int ret = 0;
	while (0 <= x && x < n && 0 <= y && y < m) {
		if (a[x][y] == 0 && delta == 0) return 0;
		a[x][y] += delta;
		x += dx, y += dy;
		ret++;
	}
	return ret;
}

map<double, bool> vis;
void dfs(int dep, int res)
{
	if (dep >= ans) return;
	if (res == 0) {
		ans = dep;
		return;
	}
	int ok = 0, i, j, cnt;
	int tx, ty, dx, dy, bx, by;
	for (i = 0; i < n && !ok; i++) {
		for (j = 0; j < m && !ok; j++) {
			if (a[i][j] == 0) continue;
			ok = 1;
			if (i == 0) {
				cnt = modify(i, j, 1, 0, 0);
				if (cnt >= 3) {
					modify(i, j, 1, 0, -1);
					dfs(dep + 1, res - cnt);
					modify(i, j, 1, 0, +1);
				}
			}
			if (j == 0) {
				cnt = modify(i, j, 0, 1, 0);
				if (cnt >= 3) {
					modify(i, j, 0, 1, -1);
					dfs(dep + 1, res - cnt);
					modify(i, j, 0, 1, +1);
				}
			}
			vis.clear();
			for (tx = i + 1; tx < n; tx++) {
				for (ty = 0; ty < m; ty++) {
					if (a[tx][ty] == 0 || tx == i || ty == j) continue;
					dx = tx - i, dy = ty - j;
					if (vis.count(double(dy) / (dx))) continue;
					vis[double(dy) / (dx)] = 1;
					//if (__gcd(abs(dx), abs(dy)) != 1) continue;
					bx = i - dx, by = j - dy;
					if (0 <= bx && bx < n && 0 <= by && by < m) continue;
					cnt = modify(i, j, dx, dy, 0);
					if (cnt >= 3) {
						modify(i, j, dx, dy, -1);
						dfs(dep + 1, res - cnt);
						modify(i, j, dx, dy, +1);
					}
				}
			}
		}
	}
}

int main()
{
	int T;
	scanf("%d", &T);
	while (T--) {
		scanf("%d%d", &n, &m);
		n++, m++;
		int sum = 0;
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < m; j++) {
				scanf("%d", &a[i][j]);
				sum += a[i][j];
			}
		}
		ans = min(14, sum / 3);
		dfs(0, sum);
		printf("%d\n", ans);
	}
	return 0;
}

