dx = [-1,-1,-1,0,0,1,1,1]
dy = [-1,0,1,-1,1,-1,0,1]

def in_bound(x:int, y:int, N:int, M:int):
    return 0 <= x < N and 0 <= y < M

def dfs(N:int, M:int, maze:list, used:list, curr_sum:int, start:int):
    global max_num
    flag = True
    for pos in range(start, N*M):
        i, j = divmod(pos, M)
        # 找到下一个没被用到的点
        if used[i][j] == -1:
            flag = False
            # 选中的点记为1
            used[i][j] = 1
            blocked = []
            # 周边点记为0
            for k in range(8):
                nx = i + dx[k]
                ny = j + dy[k]
                if in_bound(nx, ny, N, M) and used[nx][ny] == -1:
                    used[nx][ny] = 0
                    blocked.append((nx, ny))
            # 继续寻找
            dfs(N, M, maze, used, curr_sum + maze[i][j], pos + 1)
            # 回溯状态
            used[i][j] = -1
            for x, y in blocked:
                used[x][y] = -1
    if flag:
		# 没有点能再加入了
        max_num = max(max_num, curr_sum)

def calculate_num(N: int, M: int, maze: list):
    global max_num
    used = [[-1]*M for _ in range(N)]
    max_num = 0
    dfs(N, M, maze, used, 0, 0)
    return max_num

T = int(input())
for _ in range(T):
    N, M = map(int, input().split())
    maze = [list(map(int, input().split())) for _ in range(N)]
    print(calculate_num(N, M, maze))