#include <bits/stdc++.h>
#pragma GCC optimize("O3")
using namespace std;
using ll = long long;
using vi = vector<int>;
using pii = pair<int, int>;
using ld = long double;
int a[12][2000];
int best[2000][1 << 12];
int32_t main() {
  ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  int t;
  cin >> t;
  while (t--) {
    int n, m;
    cin >> n >> m;
    for (int i = 0; i < n; i++) {
      for (int j = 0; j < m; j++) {
        cin >> a[i][j];
      }
    }
    vector<vector<pii>> w(n);
    for (int j = 0; j < m; j++) {
      vi opt(n, 0);
      for (int i = 0; i < n; i++) {
        opt[i] = a[i][j];
      }
      sort((opt).begin(), (opt).end());
      reverse((opt).begin(), (opt).end());
      for (int i = 1; i < n; i++) {
        opt[i] += opt[i - 1];
      }
      for (int k = 0; k < n; k++) {
        w[k].push_back({opt[k], j});
      }
    }
    vi ids;
    for (int i = 0; i < n; i++) {
      sort((w[i]).begin(), (w[i]).end(), greater<pii>());
      w[i].resize(min(n, (int)((w[i]).size())));
      for (auto p : w[i]) {
        ids.push_back(p.second);
      }
    }
    vector<bool> taken(m, false);
    for (int x : ids) taken[x] = true;
    for (int j = 0; j < m; j++)
      if (taken[j]) {
        memset(best[j], 0, sizeof(best[j]));
        for (int m = 0; m < (1 << n); m++) {
          int val = 0;
          for (int i = 0; i < n; i++) {
            if ((m >> i) & 1) {
              val += a[i][j];
            }
          }
          int mm = m;
          for (int shift = 0; shift < n; shift++) {
            best[j][mm] = max(best[j][mm], val);
            int lo_bit = (mm >> (n - 1));
            mm = (mm << 1);
            if (mm & (1 << n)) mm ^= (1 << n);
            if (mm & 1) mm ^= 1;
            if (lo_bit) mm ^= 1;
          }
        }
      }
    vi dp(1 << n, 0);
    for (int j = 0; j < m; j++)
      if (taken[j]) {
        vi DP = dp;
        for (int m1 = 0; m1 < (1 << n); m1++) {
          for (int m2 = m1;; m2 = (m2 - 1) & m1) {
            DP[m1] = max(DP[m1], dp[m1 ^ m2] + best[j][m2]);
            if (!m2) break;
          }
        }
        dp = DP;
      }
    cout << dp[(1 << n) - 1] << '\n';
  }
}
