#include <bits/stdc++.h>
using namespace std;
const int max_n = 1e5 + 5;
int n, m, v;
struct Node {
  int deg{};
  vector<int> edge;
  Node() {
    deg = 0;
    edge.clear();
  }
} node[max_n * 2];
vector<int> val[max_n];
int s[max_n];
int k = 0;
bool cmp(int x, int y) { return val[k][x] < val[k][y]; }
vector<int> ans;
void Topology() {
  queue<int> q;
  for (int i = 1; i <= v; i++)
    if (node[i].deg == 0) q.push(i);
  while (!q.empty()) {
    int p = q.front();
    ans.push_back(p);
    q.pop();
    for (auto j : node[p].edge) {
      if (--node[j].deg == 0) q.push(j);
    }
  }
}
signed main() {
  scanf("%d %d", &n, &m);
  for (int i = 1; i <= m; i++) s[i] = i;
  v = m + 1;
  for (int i = 1; i <= n; i++) {
    val[i].push_back(0);
    for (int j = 1; j <= m; j++) {
      int x;
      scanf("%d", &x);
      val[i].push_back(x);
    }
  }
  for (k = 1; k <= n; k++) {
    sort(s + 1, s + 1 + m, cmp);
    int j = 1, l;
    while (j <= m && val[k][s[j]] == -1) j++;
    int last = m + 1;
    for (; j <= m; j = l) {
      l = j;
      while (l <= m && val[k][s[j]] == val[k][s[l]]) l++;
      int New = ++v;
      for (int i = j; i < l; i++) {
        node[last].edge.push_back(s[i]), node[s[i]].deg++;
        node[s[i]].edge.push_back(New), node[New].deg++;
      }
      last = New;
    }
  }
  Topology();
  if (ans.size() != v)
    printf("-1\n");
  else
    for (auto i : ans)
      if (i <= m) printf("%d ", i);
  return 0;
}
