#include <bits/stdc++.h>
using namespace std;
struct Graph {
  struct Edge {
    int to;
  };
  const static int MAXNODE = 3 * 1e5 + 2;
  vector<int> g[MAXNODE];
  vector<Edge> edge;
  int n;
  void init(int nn) {
    n = nn;
    for (int i = 0; i <= n; i++) g[i].clear();
    edge.clear();
  }
  void add_e(int x, int y) {
    Edge e = {y};
    g[x].push_back(edge.size());
    edge.push_back(e);
  }
  void show() {
    for (int i = 0; i <= n; i++) {
      printf("%d:", i);
      for (int ie : g[i]) printf(" %d", edge[ie].to);
      printf("\n");
    }
    printf("\n");
  }
  int in_order[MAXNODE];
  void init_in_order() {
    fill_n(in_order, n + 1, 0);
    for (int i = 0; i < n; i++)
      for (int ie : g[i]) in_order[edge[ie].to]++;
  }
  bool topological_sort(vector<int>& result) {
    init_in_order();
    queue<int> q;
    for (int i = 0; i < n; i++)
      if (in_order[i] == 0) q.push(i);
    while (q.size()) {
      int cur = q.front();
      q.pop();
      result.push_back(cur);
      for (int ie : g[cur]) {
        const Edge& e = edge[ie];
        in_order[e.to]--;
        if (in_order[e.to] == 0) q.push(e.to);
      }
    }
    return result.size() == n;
  }
  void show_order() {
    for (int i = 0; i < n; i++) printf("in_order[%d] = %d\n", i, in_order[i]);
  }
};
const int HH = 1e5 + 3;
int n;
int m;
struct Ele {
  int row;
  int col;
  int val;
  bool operator<(const Ele& ele) const {
    if (val == ele.val) {
      if (row == ele.row) return col < ele.col;
      return row < ele.row;
    }
    return val < ele.val;
  }
};
vector<Ele> row[HH];
Graph graph;
bool cmp(int x, const Ele& ele) { return x < ele.val; }
int main() {
  ios::sync_with_stdio(false);
  cin >> n >> m;
  for (int i = 0; i < n; i++) {
    auto& r = row[i];
    for (int j = 0; j < m; j++) {
      int x;
      cin >> x;
      if (x != -1) r.push_back((Ele){i, j, x});
    }
    sort(begin(r), end(r));
  }
  graph.init(m + n * m);
  int temp_node = m;
  for (int i = 0; i < n; i++) {
    auto& r = row[i];
    if (!r.size()) continue;
    int x = begin(r)->val;
    auto pre = begin(r);
    auto aft = upper_bound(begin(r), end(r), x, cmp);
    for (auto iter = pre; iter != aft; iter++)
      graph.add_e(iter->col, temp_node);
    pre = aft;
    while (pre != end(r)) {
      x = pre->val;
      aft = upper_bound(pre, end(r), x, cmp);
      int next_temp = temp_node + 1;
      for (auto iter = pre; iter != aft; iter++) {
        int index = iter->col;
        graph.add_e(temp_node, index);
        graph.add_e(index, next_temp);
      }
      temp_node = next_temp;
      pre = aft;
    }
    temp_node++;
  }
  vector<int> ans;
  bool ok = graph.topological_sort(ans);
  if (ok)
    for (int x : ans) {
      if (x < m) cout << x + 1 << " ";
    }
  else
    cout << -1;
  cout << endl;
}
