#include <bits/stdc++.h>
using namespace std;
int cost[14][(1 << 12) + 5];
int temp[2][(1 << 12) + 5];
int dp[14][(1 << 12) + 5];
int n, m;
int arr1[15][2020], arr[15][15];
int rec(int c, int mask) {
  if (c == m) return 0;
  if (mask == 0) return 0;
  int &ret = dp[c][mask];
  if (ret != -1) return ret;
  ret = 0;
  ret = rec(c + 1, mask);
  for (int i = mask; i > 0; i = (i - 1) & mask) {
    ret = max(ret, cost[c][i] + rec(c + 1, mask ^ i));
  }
  return ret;
}
int main() {
  int t;
  scanf("%d", &t);
  while (t--) {
    memset(cost, 0, sizeof cost);
    memset(dp, -1, sizeof dp);
    memset(arr, 0, sizeof arr);
    pair<int, int> mm[2020];
    scanf("%d %d", &n, &m);
    for (int i = 0; i < n; i++) {
      int mx = 0;
      for (int j = 0; j < m; j++) {
        scanf("%d", &arr1[i][j]);
      }
    }
    for (int j = 0; j < m; j++) {
      int mx = 0;
      for (int i = 0; i < n; i++) mx = max(mx, arr1[i][j]);
      mm[j] = {mx, j};
    }
    sort(mm, mm + m);
    reverse(mm, mm + m);
    m = min(m, n);
    for (int i = 0; i < n; i++) {
      for (int j = 0; j < m; j++) arr[i][j] = arr1[i][mm[j].second];
    }
    for (int j = 0; j < m; j++) {
      int f = 0;
      for (int ms = 0; ms < 1 << n; ms++) {
        temp[0][ms] = temp[1][ms] = 0;
        for (int k = 0; k < n; k++) {
          if (ms & (1 << k)) temp[0][ms] += arr[k][j];
        }
        cost[j][ms] = max(cost[j][ms], temp[0][ms]);
      }
      for (int k = 0; k < n; k++) {
        for (int ms = 0; ms < 1 << n; ms++) {
          int nw = ms << 1;
          if (ms & (1 << (n - 1))) {
            nw |= (1 << 0);
            nw ^= (1 << (n));
          }
          cost[j][nw] = max(cost[j][nw], temp[f][ms]);
          temp[f ^ 1][nw] = temp[f][ms];
        }
        f ^= 1;
      }
    }
    printf("%d\n", rec(0, (1 << n) - 1));
  }
}
