#include <bits/stdc++.h>
using namespace std;
int T, n, m;
struct A {
  int c[13], maxn;
} a[2005];
int dp[13][1 << 12], S, cnt;
int F[13][1 << 12], dog[13], d[1 << 12];
int D[1 << 12];
int read() {
  int x = 0;
  char ch = getchar();
  while (!isdigit(ch)) ch = getchar();
  while (isdigit(ch)) x = (x << 3) + (x << 1) + (ch ^ 48), ch = getchar();
  return x;
}
int cmp(A u, A v) { return u.maxn > v.maxn; }
int main() {
  T = read();
  for (int i = 0; i <= 11; i++) D[1 << i] = i + 1;
  while (T--) {
    n = read(), m = read();
    S = 1 << n;
    for (int i = 1; i <= m; i++) a[i].maxn = 0;
    for (int i = 1; i <= n; i++) {
      for (int j = 1; j <= m; j++)
        a[j].c[i] = read(), a[j].maxn = max(a[j].maxn, a[j].c[i]);
    }
    sort(a + 1, a + m + 1, cmp);
    cnt = min(n, m);
    memset(F, 0, sizeof(F));
    memset(dp, 0, sizeof(dp));
    for (int i = 1; i <= cnt; i++) {
      for (int j = 1; j <= n; j++) dog[j] = a[i].c[j];
      for (int j = 1; j <= n; j++) {
        int tmp = dog[1];
        for (int k = 2; k <= n; k++) dog[k - 1] = dog[k];
        dog[n] = tmp;
        for (int k = 1, v; k < S; k++) v = k & -k, d[k] = d[k ^ v] + dog[D[v]];
        for (int k = 0; k < S; k++) F[i][k] = max(F[i][k], d[k]);
      }
    }
    dp[0][0] = 0;
    for (int i = 1; i <= cnt; i++) {
      for (int j = 0, v; j < S; j++) {
        v = j;
        while (true) {
          dp[i][j] = max(dp[i][j], dp[i - 1][v] + F[i][v ^ j]);
          if (!v) break;
          v = (v - 1) & j;
        }
      }
    }
    printf("%d\n", dp[cnt][S - 1]);
  }
  return 0;
}
