← Home
#include <bits/stdc++.h>
using namespace std;
const int N = 1005;
int n,a[N][N];deque<int> p[N];
int ptr[N],mat[N];
bool vis[N][N];
void upd(int x)
{
while (!p[x].empty() && vis[x][p[x].front()]) p[x].pop_front();
while (!p[x].empty() && vis[x][p[x].back()]) p[x].pop_back();
if (p[x].empty()) {cout << -1 << endl;exit(0);}
}
inline void del(int x,int y) {vis[x][y] = vis[y][x] = 1;}
void add(int x,int y)
{
mat[y] = x;
while (1)
{
upd(y);if (p[y].back() != x) del(p[y].back(),y);
else break;
}
}
int nxt(int x)
{
upd(x);int y = p[x].front();p[x].pop_front();
upd(x);p[x].push_front(y);return mat[p[x][1]];
}
int main ()
{
ios::sync_with_stdio(false);
cin >> n;
if (n & 1) {cout << -1 << endl;return 0;}
for (int i = 1;i <= n;i++)
{
for (int j = 1;j <= n;j++)
{ if (i != j) cin >> a[i][j],p[i].push_back(j); }
sort(p[i].begin(),p[i].end(),[&](int x,int y) {return a[i][x] < a[i][y];});
}
queue<int> q;for (int i = 1;i <= n;i++) q.push(i);
while (!q.empty())
{
int x = q.front();q.pop();
while (1)
{
upd(x);int y = p[x].front(),z = mat[y];
if (z && a[y][z] < a[y][x]) assert(0);
if (z) {mat[y] = 0;q.push(z);}
add(x,y);break;
}
}
int cur = 1;
while (1)
{
while (cur <= n) { upd(cur);if (p[cur].size() > 1) break;else ++cur;}
if (cur > n)
{
for (int i = 1;i <= n;i++) cout << p[i].front() << endl;
return 0;
}
vector<int> c1,c2;
int x = cur,y = cur;
do x = nxt(x),y = nxt(nxt(y));while (x != y);
do c1.push_back(y),y = nxt(y);while (x != y);
for (auto &i : c1)
{ int y = p[i][0];c2.push_back(y);mat[y] = 0;del(i,y); }
for (int i = 0;i < int(c1.size());i++) add(c1[i],c2[(i + 1) % c1.size()]);
}
return 0;
}