#include <bits/stdc++.h>
using namespace std;
const int V = 200020;
const int E = V * 10;
int head[V], cur[E], nxt[E], ne, in[V];
void init() {
  ne = 0, memset(head, -1, sizeof(head));
  memset(in, 0, sizeof(in));
}
inline void addEdge(int u, int v) {
  ++in[v], cur[ne] = v, nxt[ne] = head[u], head[u] = ne++;
}
void topsort(int n, int k) {
  queue<int> Q;
  for (int i = 0; i < n + k; ++i) {
    if (!in[i]) Q.push(i);
  }
  vector<int> result;
  while (!Q.empty()) {
    int u = Q.front();
    Q.pop();
    if (u < n) result.push_back(u);
    for (int i = head[u]; i != -1; i = nxt[i]) {
      if (!--in[cur[i]]) Q.push(cur[i]);
    }
  }
  if (result.size() != n) {
    cout << -1 << endl;
  } else {
    for (int i = 0; i < n; ++i) {
      printf("%d ", result[i] + 1);
    }
    puts("");
  }
}
int main() {
  int n, m, k = 0, x;
  scanf("%d %d", &n, &m);
  init();
  for (int i = 0; i < n; ++i) {
    vector<pair<int, int> > ret;
    for (int j = 0; j < m; ++j) {
      scanf("%d", &x);
      if (x < 0) continue;
      ret.push_back(make_pair(x, j));
    }
    sort(ret.begin(), ret.end());
    for (int j = 0; j < ret.size(); ++j) {
      if (j == 0 || ret[j].first != ret[j - 1].first) ++k;
      addEdge(ret[j].second, m + k + 1);
      addEdge(m + k, ret[j].second);
    }
    ++k;
  }
  topsort(m, k);
  return 0;
}
