#include <bits/stdc++.h>
using namespace std;
int H, W;
vector<int> G[1000000];
vector<vector<int> > A;
int d[1000000];
struct UnionFind {
  int par[1000000], ra[1000000];
  UnionFind() {
    for (int(i) = 0; (i) < (1000000); (i)++) par[i] = i, ra[i] = 0;
  }
  int find(int x) { return par[x] == x ? x : par[x] = find(par[x]); }
  bool same(int a, int b) { return par[a] == par[b]; }
  void unite(int a, int b) {
    if ((a = find(a)) != (b = find(b))) {
      if (ra[a] < ra[b]) swap(a, b);
      par[b] = a;
      ra[a] += ra[a] == ra[b];
    }
  }
} uf;
void add_edge(int a, int b) {
  a = uf.find(a), b = uf.find(b);
  if (a == b) return;
  G[a].push_back(b);
}
int id(int x, int y) { return x * W + y; }
int main() {
  scanf("%d%d", &H, &W);
  A.resize(H);
  for (int(i) = 0; (i) < (H); (i)++) A[i].resize(W);
  for (int(i) = 0; (i) < (H); (i)++)
    for (int(j) = 0; (j) < (W); (j)++) scanf("%d", &A[i][j]);
  for (int(i) = 0; (i) < (H); (i)++) {
    vector<pair<int, int> > lis;
    for (int(j) = 0; (j) < (W); (j)++) lis.push_back(make_pair(A[i][j], j));
    sort((lis).begin(), (lis).end());
    for (int(j) = (1); (j) < (W); (j)++)
      if (lis[j - 1].first == lis[j].first)
        uf.unite(id(i, lis[j - 1].second), id(i, lis[j].second));
  }
  for (int(j) = 0; (j) < (W); (j)++) {
    vector<pair<int, int> > lis;
    for (int(i) = 0; (i) < (H); (i)++) lis.push_back(make_pair(A[i][j], i));
    sort((lis).begin(), (lis).end());
    for (int(i) = (1); (i) < (H); (i)++)
      if (lis[i - 1].first == lis[i].first)
        uf.unite(id(lis[i - 1].second, j), id(lis[i].second, j));
  }
  for (int(i) = 0; (i) < (H); (i)++) {
    vector<pair<int, int> > lis;
    for (int(j) = 0; (j) < (W); (j)++) lis.push_back(make_pair(A[i][j], j));
    sort((lis).begin(), (lis).end());
    for (int(j) = (1); (j) < (W); (j)++)
      add_edge(id(i, lis[j - 1].second), id(i, lis[j].second));
  }
  for (int(j) = 0; (j) < (W); (j)++) {
    vector<pair<int, int> > lis;
    for (int(i) = 0; (i) < (H); (i)++) lis.push_back(make_pair(A[i][j], i));
    sort((lis).begin(), (lis).end());
    for (int(i) = (1); (i) < (H); (i)++)
      add_edge(id(lis[i - 1].second, j), id(lis[i].second, j));
  }
  vector<pair<int, int> > lis;
  for (int(i) = 0; (i) < (H); (i)++)
    for (int(j) = 0; (j) < (W); (j)++)
      lis.push_back(make_pair(A[i][j], id(i, j)));
  sort((lis).begin(), (lis).end());
  for (int(i) = 0; (i) < (lis.size()); (i)++)
    if (uf.find(lis[i].second) == lis[i].second) {
      int id = lis[i].second;
      for (int(j) = 0; (j) < (G[id].size()); (j)++)
        d[G[id][j]] = max(d[G[id][j]], d[id] + 1);
    }
  for (int(i) = 0; (i) < (H); (i)++)
    for (int(j) = 0; (j) < (W); (j)++)
      printf("%d%c", d[uf.find(id(i, j))] + 1, j + 1 == W ? '\n' : ' ');
}
