#include <bits/stdc++.h>
using namespace std;
int t;
int n, m;
int a[5][105];
int dp[105][1 << 5];
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> t;
while (t--) {
cin >> n >> m;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cin >> a[i][j];
}
}
int S = 1 << n;
memset(dp, -0x3f, sizeof(dp));
dp[0][0] = 0;
// 枚举每一列
for (int i = 0; i < m; i++) {
for (int k = 0; k < S; k++) {
if (dp[i][k] < -1e8) continue;
// 枚举第i列负责的行集合s
for (int s = 0; s < S; s++) {
if (k & s) continue; // 有交集,跳过
// 实时计算第i列对集合s的最优值
int best = 0;
for (int p = 0; p < n; p++) { // 枚举旋转
int sum = 0;
for (int j = 0; j < n; j++) {
if (s >> j & 1) {
sum += a[(j - p + n) % n][i];
}
}
best = max(best, sum);
}
int nk = k | s;
dp[i + 1][nk] = max(dp[i + 1][nk], dp[i][k] + best);
}
}
}
cout << dp[m][S - 1] << endl;
}
return 0;
}