#include <bits/stdc++.h>
using namespace std;
inline void Fail() {
  printf("-1");
  exit(0);
}
const int maxn = 100005;
int n, m, cnt;
vector<vector<int> > a;
int deg[maxn * 4], topo[maxn * 4], ans[maxn];
vector<int> edge[maxn * 4];
inline void add_edge(int a, int b) {
  edge[a].push_back(b);
  deg[b]++;
}
bool cmp(int a, int b) { return topo[a] > topo[b]; }
void Topo() {
  queue<int> q;
  for (int(i) = 0; (i) < cnt; i++)
    if (!deg[i]) q.push(i);
  while (!q.empty()) {
    int x = q.front();
    q.pop();
    for (int(i) = 0; (i) < edge[x].size(); i++) {
      int y = edge[x][i];
      deg[y]--;
      if (!deg[y]) {
        topo[y] = topo[x] + 1;
        q.push(y);
      }
    }
  }
}
int main() {
  scanf("%d%d", &n, &m);
  a.resize(n + 5);
  for (int(i) = 0; (i) < n + 2; i++) a[i].resize(m + 5);
  for (int(i) = 0; (i) < n; i++)
    for (int(j) = 0; (j) < m; j++) scanf("%d", &a[i][j]);
  cnt = m;
  for (int(i) = 0; (i) < n; i++) {
    vector<pair<int, int> > cur;
    for (int(j) = 0; (j) < m; j++) {
      if (a[i][j] < 0) continue;
      cur.push_back(make_pair(a[i][j], j));
    }
    if (cur.empty()) continue;
    sort(cur.begin(), cur.end());
    int ii = 0;
    while (ii < cur.size()) {
      int jj = ii;
      while (jj < cur.size() && cur[jj].first == cur[ii].first) jj++;
      for (int k = ii; k < jj; k++) {
        if (jj != cur.size()) add_edge(cnt + 1, cur[k].second);
        add_edge(cur[k].second, cnt);
      }
      cnt++;
      ii = jj;
    }
  }
  for (int(i) = 0; (i) < m; i++) ans[i] = i;
  Topo();
  for (int(i) = 0; (i) < cnt; i++)
    for (int(j) = 0; (j) < edge[i].size(); j++)
      if (topo[i] >= topo[edge[i][j]]) Fail();
  sort(ans, ans + m, cmp);
  for (int(i) = 0; (i) < m; i++) printf("%d ", ans[i] + 1);
  return 0;
}
