#include <bits/stdc++.h>
using namespace std;
vector<int> st[100000], edge[200000], topo;
vector<pair<int, int> > ps;
int incnt[200000], tol;
priority_queue<int> que;
bool visit[200000];
int main(void) {
  int n, m, in;
  while (scanf("%d %d", &n, &m) == 2) {
    for (int i = 0; i < m; ++i) st[i].clear();
    for (int i = 0; i < n; ++i)
      for (int j = 0; j < m; ++j) {
        scanf("%d", &in);
        st[j].push_back(in);
      }
    memset(incnt, 0, sizeof(incnt));
    tol = m;
    for (int i = 0; i < 200000; ++i) edge[i].clear();
    for (int i = 0; i < n; ++i) {
      ps.clear();
      for (int j = 0; j < m; ++j)
        if (st[j][i] >= 0) ps.push_back(make_pair(st[j][i], j));
      sort(ps.begin(), ps.end());
      for (int a = 0, b, k = ps.size(), pre = -1; a < k; a = b) {
        for (b = a; (b < k) && (ps[b].first == ps[a].first); ++b) {
          int now = ps[b].second;
          if (pre >= 0) {
            edge[pre].push_back(now);
            ++incnt[now];
          }
          edge[now].push_back(tol);
          ++incnt[tol];
        }
        pre = tol++;
      }
    }
    topo.clear();
    for (int i = 0; i < tol; ++i)
      if (!incnt[i]) que.push(-i);
    while (!que.empty()) {
      int now = -que.top();
      que.pop();
      if (now < m) topo.push_back(now + 1);
      for (int i = 0, j = edge[now].size(); i < j; ++i) {
        --incnt[edge[now][i]];
        if (!incnt[edge[now][i]]) que.push(-edge[now][i]);
      }
    }
    if (topo.size() != m)
      puts("-1");
    else {
      printf("%d", topo[0]);
      for (int i = 1, j = topo.size(); i < j; ++i) printf(" %d", topo[i]);
      putchar('\n');
    }
  }
  return 0;
}
