#include <bits/stdc++.h>
using namespace std;
int t, n, m;
int a[20][2020], dp[(1 << 12) + 10], tr[(1 << 12) + 10], pd[(1 << 12) + 10],
    tmp[(1 << 12) + 10];
int main() {
  scanf("%d", &t);
  while (t--) {
    scanf("%d%d", &n, &m);
    for (int i = 0; i < n; i++)
      for (int j = 0; j < m; j++) scanf("%d", &a[i][j]);
    vector<pair<int, int>> v;
    v.clear();
    for (int j = 0; j < m; j++) {
      int maxx = 0;
      for (int i = 0; i < n; i++) maxx = max(maxx, a[i][j]);
      v.push_back({maxx, j});
    }
    sort(v.begin(), v.end(), greater<pair<int, int>>());
    m = min(m, n);
    for (int i = 0; i < (1 << n); i++) dp[i] = 0;
    for (int i = 0; i < m; i++) {
      int x = v[i].second;
      for (int j = 0; j < (1 << n); j++) {
        pd[j] = dp[j];
        dp[j] = 0;
      }
      for (int rot = 0; rot < n; rot++) {
        for (int tt = 0; tt < (1 << n); tt++) tr[tt] = pd[tt];
        for (int k = 0; k < n; k++) {
          for (int tt = 0; tt < (1 << n); tt++) tmp[tt] = tr[tt];
          for (int tt = 0; tt < (1 << n); tt++)
            if (tt >> k & 1)
              tr[tt] = max(tr[tt], tmp[tt ^ (1 << k)] + a[(k + rot) % n][x]);
        }
        for (int tt = 0; tt < (1 << n); tt++) dp[tt] = max(dp[tt], tr[tt]);
      }
    }
    printf("%d\n", dp[(1 << n) - 1]);
  }
  return 0;
}
