#include <bits/stdc++.h>
using namespace std;
int num[2005][15];
pair<int, int> val[2005];
int f[2][1 << 12], g[1 << 12];
int dp(int n, int m) {
  static int h[15];
  int cur = 0;
  memset(f[cur], 0, sizeof(f[cur]));
  for (int i = 1; i <= m; i++) {
    cur ^= 1;
    memset(f[cur], 0, sizeof(f[cur]));
    int x = val[i].second;
    for (int j = 1; j <= n; j++) {
      for (int k = 2; k <= n; k++) swap(num[x][k], num[x][k - 1]);
      for (int k = 0; k < n; k++) h[k] = num[x][k + 1];
      memcpy(g, f[cur ^ 1], sizeof(g));
      for (int k = 1; k < (1 << n); k++)
        for (int l = 0; l < n; l++)
          if ((k >> l) & 1) g[k] = max(g[k], g[k ^ (1 << l)] + h[l]);
      for (int k = 0; k < (1 << n); k++) f[cur][k] = max(f[cur][k], g[k]);
    }
  }
  return f[cur][(1 << n) - 1];
}
int main() {
  int cases;
  scanf("%d", &cases);
  for (; cases; cases--) {
    int n, m;
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= m; i++) val[i] = pair<int, int>(0, i);
    for (int i = 1; i <= n; i++)
      for (int j = 1; j <= m; j++) {
        scanf("%d", &num[j][i]);
        val[j].first = max(val[j].first, num[j][i]);
      }
    sort(val + 1, val + m + 1);
    reverse(val + 1, val + m + 1);
    printf("%d\n", dp(n, min(n, m)));
  }
  return 0;
}
