#include <bits/stdc++.h>
using namespace std;
const long long int M = -1e18 - 18;
const long long int N = 1e7 + 1;
long long int power(long long int x, long long int y, long long int M = ::M) {
  x %= M;
  long long int ans = 1;
  while (y) {
    if (y & 1) ans = (ans * x) % M;
    y >>= 1LL;
    x = (x * x) % M;
  }
  return ans;
}
long long int add(long long int a, long long int b) {
  return ((a % M + b % M) % M);
}
long long int sub(long long int a, long long int b) {
  return ((a % M - b % M + M) % M);
}
long long int mul(long long int a, long long int b) {
  return (((a % M) * (b % M)) % M);
}
long long int divi(long long int a, long long int b) {
  return (mul(a, power(b, M - 2)) % M);
}
inline void solve() {
  int n, m;
  cin >> n >> m;
  int arr[n + 1][m + 1];
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m; j++) cin >> arr[i][j];
  }
  vector<int> grp[200];
  int dp[n + 1][m + 1];
  bool vis[n + 1][m + 1];
  memset(vis, 0, sizeof(vis));
  queue<pair<long long int, long long int> > q;
  q.push({1, 1});
  vis[1][1] = 1;
  dp[1][1] = 0;
  grp[0].push_back(arr[1][1]);
  int mx = 0;
  while (!q.empty()) {
    int x = q.front().first;
    int y = q.front().second;
    mx = max(mx, dp[x][y]);
    q.pop();
    if (y + 1 <= m && !vis[x][y + 1]) {
      vis[x][y + 1] = 1;
      dp[x][y + 1] = dp[x][y] + 1;
      grp[dp[x][y + 1]].push_back(arr[x][y + 1]);
      q.push({x, y + 1});
    }
    if (x + 1 <= n && !vis[x + 1][y]) {
      vis[x + 1][y] = 1;
      dp[x + 1][y] = dp[x][y] + 1;
      grp[dp[x + 1][y]].push_back(arr[x + 1][y]);
      q.push({x + 1, y});
    }
  }
  mx++;
  int sum = 0;
  for (int i = 0; i < mx / 2; i++) {
    int cnt[2] = {0};
    for (auto j : grp[i]) cnt[j]++;
    for (auto j : grp[mx - i - 1]) cnt[j]++;
    sum += min(cnt[0], cnt[1]);
  }
  cout << sum << "\n";
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  ;
  int t;
  cin >> t;
  while (t--) {
    solve();
  }
}
