#include <bits/stdc++.h>
using namespace std;
struct para {
  int kol, wart;
};
bool por(para a, para b) {
  if (a.wart < b.wart) return true;
  if (a.wart > b.wart) return false;
  return a.kol < b.kol;
}
int main() {
  ios_base::sync_with_stdio(0);
  int n, m;
  cin >> n >> m;
  vector<vector<int> > a(n, vector<int>(m));
  for (int i = 0; i < n; ++i)
    for (int j = 0; j < m; ++j) cin >> a[i][j];
  vector<vector<int> > G(m);
  vector<int> pusty;
  for (int i = 0; i < n; ++i) {
    vector<para> znane;
    for (int j = 0; j < m; ++j)
      if (a[i][j] != -1) znane.push_back({j, a[i][j]});
    sort(znane.begin(), znane.end(), por);
    for (int l = 0; l < znane.size();) {
      int p = l;
      while (p < znane.size() && znane[p].wart == znane[l].wart) ++p;
      --p;
      if (l != 0)
        for (int j = l; j <= p; ++j) G[G.size() - 1].push_back(znane[j].kol);
      if (p != znane.size() - 1) {
        G.push_back(pusty);
        for (int j = l; j <= p; ++j) G[znane[j].kol].push_back(G.size() - 1);
      }
      l = p + 1;
    }
  }
  vector<int> st_we(G.size(), 0);
  for (int i = 0; i < G.size(); ++i)
    for (int j = 0; j < G[i].size(); ++j) ++st_we[G[i][j]];
  queue<int> Q;
  for (int i = 0; i < m; ++i)
    if (st_we[i] == 0) Q.push(i);
  vector<int> topo;
  while (!Q.empty()) {
    int akt = Q.front();
    Q.pop();
    topo.push_back(akt);
    for (int i = 0; i < G[akt].size(); ++i) {
      --st_we[G[akt][i]];
      if (st_we[G[akt][i]] == 0) Q.push(G[akt][i]);
    }
  }
  if (topo.size() != G.size())
    cout << "-1";
  else {
    for (int i = 0; i < topo.size(); ++i)
      if (topo[i] < m) cout << topo[i] + 1 << " ";
  }
  return 0;
}
