#include <bits/stdc++.h>
using namespace std;
long long powmod(long long a, long long b) {
  long long res = 1;
  a %= 1000000007;
  for (; b; b >>= 1) {
    if (b & 1) res = res * a % 1000000007;
    a = a * a % 1000000007;
  }
  return res;
}
struct node {
  int val, id;
  bool operator<(const node a) const { return val < a.val; }
} a[1000010], b[1000010];
int fa[1000010], dp[1000010], deg[1000010];
int find(int x) { return fa[x] == x ? x : fa[x] = find(fa[x]); }
int fst[1000010], nxt[3000011], vv[3000011], e, ans;
void init() {
  memset(fst, -1, sizeof fst);
  memset(dp, 0, sizeof dp);
  memset(deg, 0, sizeof deg);
  for (int i = 0; i < 1000010; i++) fa[i] = i;
  e = 0;
}
void add(int u, int v) { vv[e] = v, nxt[e] = fst[u], fst[u] = e++; }
int dfs(int x) {
  if (dp[x]) return dp[x];
  dp[x] = 1;
  for (int i = fst[x]; ~i; i = nxt[i]) {
    int v = vv[i];
    dp[x] = max(dp[x], dfs(v) + 1);
  }
  return dp[x];
}
int main() {
  int n, m;
  scanf("%d%d", &n, &m);
  for (int i = 0; i < n; i++)
    for (int j = 0; j < m; j++) {
      int v;
      scanf("%d", &v);
      a[i * m + j].val = v;
      a[i * m + j].id = i * m + j;
    }
  init();
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) b[j] = a[i * m + j];
    sort(b, b + m);
    for (int j = 0; j < m; j++)
      if (j + 1 < m && b[j].val == b[j + 1].val)
        fa[find(b[j + 1].id)] = find(b[j].id);
  }
  for (int i = 0; i < m; i++) {
    for (int j = 0; j < n; j++) b[j] = a[j * m + i];
    sort(b, b + n);
    for (int j = 0; j < n; j++)
      if (j + 1 < n && b[j].val == b[j + 1].val)
        fa[find(b[j + 1].id)] = find(b[j].id);
  }
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) b[j] = a[i * m + j];
    sort(b, b + m);
    for (int j = 0; j < m; j++)
      if (j + 1 < m && b[j].val != b[j + 1].val) {
        add(find(b[j + 1].id), find(b[j].id));
      }
  }
  for (int i = 0; i < m; i++) {
    for (int j = 0; j < n; j++) b[j] = a[j * m + i];
    sort(b, b + n);
    for (int j = 0; j < n; j++)
      if (j + 1 < n && b[j].val != b[j + 1].val) {
        add(find(b[j + 1].id), find(b[j].id));
      }
  }
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
      printf("%d%c", dfs(find(i * m + j)), j == m - 1 ? '\n' : ' ');
    }
  }
  return 0;
}
