#include <bits/stdc++.h>
const int MAXM = 2e5 + 10;
int N, M, indgr[MAXM], Q[MAXM], totp;
std::pair<int, int> A[MAXM];
std::vector<int> G[MAXM];
void add_edge(int u, int v) {
  std::vector<int>::iterator it = lower_bound(G[u].begin(), G[u].end(), v);
  if (it != G[u].end() && *it == v) return;
  G[u].push_back(v), ++indgr[v];
}
bool topper();
int main() {
  scanf("%d%d", &N, &M);
  totp = M;
  for (int i = 0; i < N; i++) {
    for (int j = 0; j < M; j++) {
      scanf("%d", &A[j].first);
      A[j].second = j;
    }
    std::sort(A, A + M);
    int j, k = 0, k1;
    for (; k < M && A[k].first == -1; k++)
      ;
    for (j = k + 1; j < M && A[j].first == A[k].first; j++)
      ;
    for (k1 = j++; j < M; j++)
      if (A[j].first != A[k1].first) {
        for (int i1 = k; i1 < k1; i1++) add_edge(A[i1].second, totp);
        for (int j1 = k1; j1 < j; j1++) add_edge(totp, A[j1].second);
        ++totp;
        k = k1, k1 = j;
      }
    if (k1 < M) {
      for (int i1 = k; i1 < k1; i1++) add_edge(A[i1].second, totp);
      for (int j1 = k1; j1 < j; j1++) add_edge(totp, A[j1].second);
      ++totp;
    }
  }
  if (topper()) {
    for (int i = 0; i < totp; i++)
      if (Q[i] < M) printf("%d ", Q[i] + 1);
    putchar('\n');
  } else
    puts("-1");
  return 0;
}
bool topper() {
  int hd = 0, tl = 0;
  for (int i = 0; i < totp; i++)
    if (!indgr[i]) Q[tl++] = i;
  while (hd < tl) {
    int now = Q[hd++];
    for (auto v : G[now])
      if (!(--indgr[v])) Q[tl++] = v;
  }
  return tl == totp;
}
