#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;   }   