#include <bits/stdc++.h>
using namespace std;
struct Cell {
int value;
int x, y;
int index;
};
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
int T;
cin >> T;
while(T--){
int n, m;
cin >> n >> m;
vector<Cell> cells(n * m);
for(int i=0; i<n; ++i){
for(int j=0; j<m; ++j){
int val;
cin >> val;
int idx = i * m + j;
cells[idx] = Cell{val, i, j, idx};
}
}
sort(cells.begin(), cells.end(), [&](const Cell &a, const Cell &b) -> bool{
return a.value < b.value;
});
vector<int> length(n * m, 1);
vector<int> predecessor(n * m, -1);
vector<pair<int, int>> directions = { {-1,0}, {1,0}, {0,-1}, {0,1} };
for(auto &cell : cells){
int curr_idx = cell.index;
for(auto &{dx, dy} : directions){
int nx = cell.x + dx;
int ny = cell.y + dy;
if(nx >=0 && nx < n && ny >=0 && ny < m){
int neighbor_idx = nx * m + ny;
if(cells[neighbor_idx].value < cell.value){
if(length[neighbor_idx] + 1 > length[curr_idx]){
length[curr_idx] = length[neighbor_idx] +1;
predecessor[curr_idx] = neighbor_idx;
}
else if(length[neighbor_idx] +1 == length[curr_idx]){
if(predecessor[curr_idx] == -1 || cells[neighbor_idx].value < cells[predecessor[curr_idx]].value){
predecessor[curr_idx] = neighbor_idx;
}
}
}
}
}
}
int max_len = 0;
int end_idx = -1;
for(int i=0; i<n*m; ++i){
if(length[i] > max_len){
max_len = length[i];
end_idx = i;
}
else if(length[i] == max_len){
if(cells[i].value < cells[end_idx].value){
end_idx = i;
}
}
}
vector<int> path;
int current = end_idx;
while(current != -1){
path.push_back(cells[current].value);
current = predecessor[current];
}
reverse(path.begin(), path.end());
cout << path.size() << "\n";
for(int i=0; i<path.size(); ++i){
if(i > 0) cout << " ";
cout << path[i];
}
cout << "\n";
}
}