#include <bits/stdc++.h>
using namespace std;
mt19937_64 mt(time(0));
const int MAXN = 12;
const int MAXM = 2000 + 10;
int nums[MAXN][MAXM], dp[MAXN + 10][1 << MAXN], cache[1 << MAXN];
bool cmp(const pair<int, int>& a, const pair<int, int>& b) {
  return nums[a.first][a.second] > nums[b.first][b.second];
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  cout.precision(10);
  cout << fixed;
  int t;
  cin >> t;
  while (t--) {
    memset(dp, 0, sizeof(dp));
    int n, m;
    cin >> n >> m;
    vector<pair<int, int> > pos;
    pos.reserve(n * m);
    for (int i = 0; i < n; i++) {
      for (int j = 0; j < m; j++) {
        cin >> nums[i][j];
        pos.emplace_back(i, j);
      }
    }
    sort(pos.begin(), pos.end(), cmp);
    set<int> table;
    for (const auto& p : pos) {
      table.insert(p.second);
      if (table.size() == n) break;
    }
    m = 1 << n;
    int idx = 0;
    for (int j : table) {
      memset(cache, 0, sizeof(cache));
      for (int mask = 0; mask < m; mask++) {
        int val = 0;
        for (int i = 0; i < n; i++) {
          if (mask & (1 << i)) {
            val += nums[i][j];
          }
        }
        if (cache[mask] >= val) continue;
        for (int i = 0, now = mask; i < n; i++) {
          cache[now] = max(cache[now], val);
          now = (now >> 1) | ((now & 1) << (n - 1));
        }
      }
      for (int mask = 0; mask < m; mask++) {
        for (int cur_mask = mask;; cur_mask = (cur_mask - 1) & mask) {
          dp[idx + 1][mask] = max(dp[idx + 1][mask],
                                  dp[idx][mask ^ cur_mask] + cache[cur_mask]);
          if (cur_mask == 0) break;
        }
      }
      idx++;
    }
    cout << dp[idx][(1 << n) - 1] << '\n';
  }
  return 0;
}
