#include <bits/stdc++.h>
using namespace std;
int n, m;
const int N = 1e6 + 5;
vector<vector<int> > a;
vector<int> gT[N];
int p[N], dp[N];
int find(int i) {
  if (i == p[i]) {
    return i;
  }
  return p[i] = find(p[i]);
}
void merge(int a, int b) {
  a = find(a), b = find(b);
  if (a == b) {
    return;
  }
  p[b] = a;
}
int f(int u) {
  if (dp[u] != -1) {
    return dp[u];
  }
  dp[u] = 0;
  for (auto &v : gT[u]) {
    dp[u] = max(dp[u], f(v));
  }
  return ++dp[u];
}
int main() {
  cin >> n >> m;
  a.resize(n);
  for (int i = 0; i < n; i++) {
    a[i].resize(m);
    for (int j = 0; j < m; j++) {
      scanf("%d", &a[i][j]);
    }
  }
  for (int i = 0; i < n * m; i++) {
    p[i] = i;
  }
  for (int i = 0; i < n; i++) {
    vector<pair<int, int> > t;
    for (int j = 0; j < m; j++) {
      t.push_back(make_pair(a[i][j], i * m + j));
    }
    sort(((t).begin()), ((t).end()));
    for (int j = 1; j < m; j++) {
      if (t[j].first == t[j - 1].first) {
        merge(t[j].second, t[j - 1].second);
      }
    }
  }
  for (int j = 0; j < m; j++) {
    vector<pair<int, int> > t;
    for (int i = 0; i < n; i++) {
      t.push_back(make_pair(a[i][j], i * m + j));
    }
    sort(((t).begin()), ((t).end()));
    for (int j = 1; j < n; j++) {
      if (t[j].first == t[j - 1].first) {
        merge(t[j].second, t[j - 1].second);
      }
    }
  }
  for (int i = 0; i < n; i++) {
    vector<pair<int, int> > t;
    for (int j = 0; j < m; j++) {
      t.push_back(make_pair(a[i][j], find(i * m + j)));
    }
    sort(((t).begin()), ((t).end()));
    t.resize(unique(((t).begin()), ((t).end())) - t.begin());
    for (int j = 0; j + 1 < t.size(); j++) {
      gT[t[j + 1].second].push_back(t[j].second);
    }
  }
  for (int j = 0; j < m; j++) {
    vector<pair<int, int> > t;
    for (int i = 0; i < n; i++) {
      t.push_back(make_pair(a[i][j], find(i * m + j)));
    }
    sort(((t).begin()), ((t).end()));
    t.resize(unique(((t).begin()), ((t).end())) - t.begin());
    for (int i = 0; i + 1 < t.size(); i++) {
      gT[t[i + 1].second].push_back(t[i].second);
    }
  }
  memset(dp, -1, sizeof dp);
  for (int i = 0; i < n * m; i++) {
    printf("%d ", f(find(i)));
    if (i % m == m - 1) {
      printf("\n");
    }
  }
  return 0;
}
