#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6 + 7;
int n, m;
int a[maxn];
int ans[maxn];
int st[maxn];
pair<int, int> t[maxn];
pair<int, int> b[maxn];
int f[maxn];
inline int find(int x) { return f[x] == x ? x : f[x] = find(f[x]); }
void unit(int x, int y) {
  x = find(x);
  y = find(y);
  f[x] = y;
}
struct Edge {
  int v;
  int nxt;
  Edge() {}
  Edge(int a, int b) { v = a, nxt = b; }
} e[maxn << 1];
int cnt, head[maxn];
void ini() {
  memset(head, -1, sizeof(head));
  for (int i = 0; i < int(maxn); i++) f[i] = i;
}
void add(int u, int v) {
  e[cnt] = Edge(v, head[u]);
  head[u] = cnt++;
}
int main() {
  ini();
  scanf("%d%d", &n, &m);
  for (int i = 0; i < int(n); i++) {
    for (int j = 0; j < int(m); j++) {
      scanf("%d", &a[i * m + j]);
      b[i * m + j] = make_pair(a[i * m + j], i * m + j);
    }
  }
  sort(b, b + n * m);
  for (int i = 0; i < int(n); i++) {
    for (int j = 0; j < int(m); j++) {
      t[j] = make_pair(a[i * m + j], j);
    }
    sort(t, t + m);
    for (int j = 1; j < int(m); j++) {
      if (t[j - 1].first == t[j].first)
        unit(i * m + t[j - 1].second, i * m + t[j].second);
    }
  }
  for (int j = 0; j < int(m); j++) {
    for (int i = 0; i < int(n); i++) {
      t[i] = make_pair(a[i * m + j], i);
    }
    sort(t, t + n);
    for (int i = 1; i < int(n); i++) {
      if (t[i - 1].first == t[i].first)
        unit(j + m * t[i - 1].second, j + m * t[i].second);
    }
  }
  for (int i = 0; i < int(n); i++) {
    for (int j = 0; j < int(m); j++) {
      t[j] = make_pair(a[i * m + j], j);
    }
    sort(t, t + m);
    for (int j = 1; j < int(m); j++) {
      if (t[j - 1].first == t[j].first) continue;
      int u = find(i * m + t[j - 1].second);
      int v = find(i * m + t[j].second);
      add(u, v);
    }
  }
  for (int j = 0; j < int(m); j++) {
    for (int i = 0; i < int(n); i++) {
      t[i] = make_pair(a[i * m + j], i);
    }
    sort(t, t + n);
    for (int i = 1; i < int(n); i++) {
      if (t[i - 1].first == t[i].first) continue;
      int u = find(j + m * t[i - 1].second);
      int v = find(j + m * t[i].second);
      add(u, v);
    }
  }
  for (int k = 0; k < int(n * m); k++) {
    int u = b[k].second;
    for (int i = head[u]; i != -1; i = e[i].nxt) {
      int v = e[i].v;
      ans[v] = max(ans[v], ans[u] + 1);
    }
  }
  for (int i = 0; i < int(n * m); i++) ans[i] = ans[find(i)];
  for (int i = 0; i < int(n); i++) {
    for (int j = 0; j < int(m); j++) printf("%d ", ans[i * m + j] + 1);
    printf("\n");
  }
  return 0;
}
