#include <bits/stdc++.h>
using namespace std;
int T, n, m;
int f[5050], g[5050], h[5050];
struct Col {
  int a[20];
  int Mx;
} e[2005];
bool operator<(Col A, Col B) { return A.Mx > B.Mx; }
int lowbit(int x) { return x & -x; }
int b[15], lg[5050], ans;
int main() {
  scanf("%d", &T);
  for (int i = 0; i < 12; i++) lg[1 << i] = i;
  while (T--) {
    scanf("%d%d", &n, &m);
    ans = 0;
    memset(e, 0, sizeof(e));
    memset(f, 0, sizeof(f));
    memset(g, 0, sizeof(g));
    memset(h, 0, sizeof(h));
    for (int i = 1; i <= n; i++) {
      for (int j = 1; j <= m; j++) {
        scanf("%d", &e[j].a[i]);
        e[j].Mx = max(e[j].Mx, e[j].a[i]);
      }
    }
    sort(e + 1, e + 1 + m);
    int tot = 1 << n;
    for (int k = 1; k <= n; k++) {
      for (int j = 1; j <= n; j++) {
        for (int i = 0; i < tot; i++) f[i] = g[i];
        for (int i = 1; i <= n; i++) {
          int pos = i + j - 1;
          if (pos > n) pos -= n;
          b[pos] = e[k].a[i];
        }
        for (int i = 0; i < tot; i++) {
          int p = (tot - 1) ^ i;
          while (p) {
            int x = lowbit(p), y = lg[x];
            f[i | x] = max(f[i | x], f[i] + b[y + 1]);
            p -= x;
          }
        }
        ans = max(ans, f[tot - 1]);
        for (int i = 0; i < tot; i++) h[i] = max(h[i], f[i]);
      }
      for (int i = 0; i < tot; i++) g[i] = h[i];
    }
    printf("%d\n", ans);
  }
  return 0;
}
