#include <bits/stdc++.h>
using namespace std;
void read(int &x) {
  x = 0;
  char c = getchar();
  int f = 1;
  while (c < '0' || c > '9') {
    if (c == '-') f = -f;
    c = getchar();
  }
  while (c >= '0' && c <= '9') {
    x = (x << 3) + (x << 1) + c - '0';
    c = getchar();
  }
  x *= f;
  return;
}
void print(int x) {
  if (x < 10) {
    putchar(x + '0');
    return;
  }
  print(x / 10);
  putchar(x % 10 + '0');
}
void write(int x) {
  if (x < 0) x = -x, putchar('-');
  print(x);
}
int maxt(int a, int b) { return a < b ? b : a; }
int mint(int a, int b) { return a < b ? a : b; }
queue<int> q;
vector<int> G[1000005];
int n, m, a[1000005], s[1000005], d[1000005], f[1000005];
struct node {
  int p, id;
  bool operator<(node rhs) const { return p < rhs.p; }
} t[1000005];
int findset(int x) { return x == f[x] ? f[x] : f[x] = findset(f[x]); }
void topo() {
  for (int i = 1; i <= n * m; i++) {
    int u = findset(i);
    if (!d[u] && !s[u]) q.push(u), s[u] = 1;
  }
  while (!q.empty()) {
    int u = q.front();
    q.pop();
    for (int i = 0; i < G[u].size(); i++) {
      int v = G[u][i];
      d[v]--;
      s[v] = maxt(s[v], s[u] + 1);
      if (!d[v]) q.push(v);
    }
  }
}
map<int, int> mp;
int main() {
  read(n), read(m);
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= m; j++) {
      f[m * (i - 1) + j] = m * (i - 1) + j;
      read(a[m * (i - 1) + j]);
    }
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m; j++) {
      t[j].p = a[m * (i - 1) + j];
      t[j].id = m * (i - 1) + j;
    }
    sort(t + 1, t + 1 + m);
    for (int j = 1; j < m; j++)
      if (t[j].p == t[j + 1].p) {
        int u = findset(t[j].id), v = findset(t[j + 1].id);
        f[v] = u;
      }
  }
  for (int j = 1; j <= m; j++) {
    for (int i = 1; i <= n; i++) {
      t[i].p = a[m * (i - 1) + j];
      t[i].id = m * (i - 1) + j;
    }
    sort(t + 1, t + 1 + n);
    for (int i = 1; i < n; i++)
      if (t[i].p == t[i + 1].p) {
        int u = findset(t[i].id), v = findset(t[i + 1].id);
        f[v] = u;
      }
  }
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m; j++) {
      t[j].p = a[m * (i - 1) + j];
      t[j].id = findset(m * (i - 1) + j);
    }
    sort(t + 1, t + 1 + m);
    for (int j = 1; j < m; j++)
      if (t[j].id != t[j + 1].id)
        G[t[j].id].push_back(t[j + 1].id), d[t[j + 1].id]++;
  }
  for (int j = 1; j <= m; j++) {
    for (int i = 1; i <= n; i++) {
      t[i].p = a[m * (i - 1) + j];
      t[i].id = findset(m * (i - 1) + j);
    }
    sort(t + 1, t + 1 + n);
    for (int i = 1; i < n; i++)
      if (t[i].id != t[i + 1].id)
        G[t[i].id].push_back(t[i + 1].id), d[t[i + 1].id]++;
  }
  topo();
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m; j++) {
      int u = findset(m * (i - 1) + j);
      write(s[u]), putchar(' ');
    }
    putchar('\n');
  }
  return 0;
}
