#include <bits/stdc++.h>
using namespace std;
const int inf = 1e9;
const long long inf64 = 1e18;
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  int n, m;
  cin >> n >> m;
  vector<vector<int>> a(n, vector<int>(m));
  vector<int> mx_row(n * m), mx_col(n * m);
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
      int x;
      cin >> x;
      x--;
      mx_row[i] = max(mx_row[i], x);
      mx_col[j] = max(mx_col[j], x);
      a[i][j] = x;
    }
  }
  vector<int> in_row(n * m), in_col(n * m);
  for (int i = 0; i < n; i++) {
    in_row[mx_row[i]] = 1;
  }
  for (int j = 0; j < m; j++) {
    in_col[mx_col[j]] = 1;
  }
  vector<vector<int>> mat;
  set<tuple<int, int, int>> poses;
  int nn = 0, mm = 0;
  auto upd = [&](int i, int j) {
    for (int x = 0; x <= 4; x++) poses.erase({x, i, j});
    int c = 0;
    if (i > 0 && mat[i - 1][j] != -1) c++;
    if (j > 0 && mat[i][j - 1] != -1) c++;
    if (i + 1 < nn && mat[i + 1][j] != -1) c++;
    if (j + 1 < mm && mat[i][j + 1] != -1) c++;
    poses.insert({c, i, j});
  };
  for (int x = n * m - 1; x >= 0; x--) {
    if (nn > n || mm > m) {
      cout << "-1\n";
      return 0;
    }
    if (in_row[x] && in_col[x]) {
      nn++;
      mm++;
      for (auto &r : mat) r.push_back(-1);
      mat.emplace_back(mm, -1);
      mat[nn - 1][mm - 1] = x;
      for (int i = 0; i < mm; i++) upd(nn - 1, i);
      for (int i = 0; i < nn; i++) upd(i, mm - 1);
    } else if (in_row[x]) {
      nn++;
      mat.emplace_back(mm, -1);
      for (int j = 0; j < mm; j++) {
        if (mat[nn - 2][j] != -1) {
          mat[nn - 1][j] = x;
          upd(nn - 2, j);
          break;
        }
      }
      for (int j = 0; j < mm; j++) upd(nn - 1, j);
    } else if (in_col[x]) {
      mm++;
      for (auto &r : mat) r.push_back(-1);
      for (int i = 0; i < nn; i++) {
        if (mat[i][mm - 2] != -1) {
          mat[i][mm - 1] = x;
          upd(i, mm - 2);
          break;
        }
      }
      for (int i = 0; i < nn; i++) upd(i, mm - 1);
    } else {
      while (!poses.empty()) {
        int i, j;
        tie(ignore, i, j) = *(--poses.end());
        if (mat[i][j] == -1) break;
        poses.erase(--poses.end());
      }
      if (poses.empty()) {
        cout << "-1\n";
        return 0;
      }
      int i, j;
      tie(ignore, i, j) = *(--poses.end());
      mat[i][j] = x;
      for (int di = -1; di <= 1; di++) {
        for (int dj = -1; dj <= 1; dj++) {
          if (di && dj) continue;
          int ti = i + di;
          int tj = j + dj;
          if (ti < 0 || ti >= nn || tj < 0 || tj >= mm) continue;
          upd(ti, tj);
        }
      }
    }
  }
  if (nn != n || mm != m) {
    cout << "-1\n";
    return 0;
  }
  for (auto r : mat) {
    for (auto x : r) cout << x + 1 << " ";
    cout << "\n";
  }
  return 0;
}
