func_code_string: #include <bits/stdc++.h>   using namespace std;   const long long N = 400010;   inline long long read() {     long long s = 0, w = 1;     register char ch = getchar();     while (ch <  0  || ch >  9 ) {       if (ch ==  - ) w = -1;       ch = getchar();     }     while (ch >=  0  && ch <=  9 )       s = (s << 3) + (s << 1) + (ch ^ 48), ch = getchar();     return s * w;   }   long long n, m, head[N], maxE, tot, deg[N], ot[N], cnt;   struct Edge {     long long nxt, to;   } e[N];   struct Node {     long long w, id;   } p[N];   inline void Add(long long u, long long v) {     e[++maxE].nxt = head[u];     head[u] = maxE;     e[maxE].to = v;   }   inline bool cp(Node x, Node y) { return x.w < y.w; }   inline void Topo() {     queue<long long> Q;     for (register long long i = 1; i <= tot; i++)       if (!deg[i]) Q.push(i);     while (!Q.empty()) {       long long x = Q.front();       Q.pop();       if (x <= m) ot[++cnt] = x;       for (register long long i = head[x]; i; i = e[i].nxt) {         deg[e[i].to]--;         if (!deg[e[i].to]) Q.push(e[i].to);       }     }     if (m > cnt) {       puts( -1 );       exit(0);     }     return;   }   signed main() {     n = read(), m = read();     tot = m;     for (register long long i = 1; i <= n; tot++, i++) {       for (register long long j = 1; j <= m; j++) p[j].w = read(), p[j].id = j;       sort(p + 1, p + 1 + m, cp);       for (register long long j = 1; j <= m; j++) {         if (p[j].w == -1) continue;         if (j == 1 || p[j].w ^ p[j - 1].w) tot++;         Add(tot, p[j].id), Add(p[j].id, tot + 1);         deg[p[j].id]++, deg[tot + 1]++;       }     }     Topo();     for (register long long i = 1; i <= m; i++) printf( %lld  , ot[i]);     puts(  );     return 0;   }   