两次排序得到结果

const [n, m] = readline().split(' ').map(Number);
// arr: n * m * 4
let arr = [];
// id: n * m
const id = [];

for (let i = 0; i < n; i++) {
  const temp = readline().split(' ').map(Number);
  let arrTmp = [];
  let idTmp = [];
  for (let j = 0; j < m; j++) {
    arrTmp.push(temp.slice(j * 4, j * 4 + 4));
  }
  // 按照x的值升序排列
  arrTmp = arrTmp.sort((a, b) => a[1] - b[1]);
  for (let j = 0; j < m; j++) {
    // 存储每行的id排序
    idTmp.push(arrTmp[j][0]);
  }
  id.push(idTmp);
  // arr存储着每行的头和尾巴 n * m * 2
  arr.push([arrTmp[0], arrTmp[m - 1]]);
}
for (let i = 0; i < n; i++) {
  // 每行打印
  console.log(id[i].join(' '));
}
// 按照y降序排列
arr = arr.sort((a, b) => b[0][2] - a[0][2]);
// 遍历所有头、再是所有尾巴
for (let i = 0; i < 2; i++) {
  const temp = [];
  for (let j = 0; j < n; j++) {
    // 把每行的(头或尾)id打印下来
    temp.push(arr[j][i][0]);
  }
  console.log(temp.join(' '));
}