#include <iostream>
using namespace std;
int a[30][30], transa[30][30], s[30], lant[30], st = 0, fi = 0, n, k, l = 0, pr;
struct marc{ int st; int sursa;} d[30];
void readdata()
{
cin >> n;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
{
cin >> a[i][j] ; transa[i][j] = a[i][j];
}
}
void print( int m)
{
for (int i = 1; i <= m; i++) cout << s[i] << " ";
cout << endl;
}
int verif() // verificarea existentei lantului
{
int k;
for (int i = 1; i <= n; i++)
{
k = 0;
for (int j = 1; j <= n; j++) if (a[i][j] != 0 ) k++;
if (k % 2 == 1 && st == 0) st = i;
else
if (k % 2 == 1 && st != 0 && fi == 0) fi = i;
else
if (k % 2 == 1 && st != 0 && fi != 0) return 0;
}
if (st == 0 && fi == 0 ) {st = 1; fi = 2; return 1;}
if (st != 0 && fi == 0 ) return 0;
return 1;
}
void lan ()
{
int x;
for (int i = 1; i <= n; i++) d[i].st = 0;
d[st].st = 1; x = st;
do
{
for(int i = 1; i <= n; i++)
if(a[x][i] !=0 && d[i].st == 0)
{
d[i].st = 1; d[i].sursa = x;
}
d[x].st = 2;
k = 1;
while (d[k].st != 1) k++;
x = k;
} while (x != fi);
l = k = 1;
s[l] = lant[k] = fi;
while (x != st)
{
x = d[x].sursa;
l++; k++;
s[l] = lant[k] = x;
}
}
int grad(int x)
{
int s = 0;
for (int i = 1; i <= n; i++)
if (transa[x][i] != 0) s++;
return s;
}
void exclude_cic()
{
transa[s[1]][s[l]] = transa[s[l]][s[1]] = 0;
for (int i = 1; i<l; i++)
transa[s[i]][s[i + 1]] = transa[s[i + 1]][s[i]] = 0;
}
int exist()
{
for (int i = 1; i <= n; i++) if (grad(i) > 0) return i;
return 0;
}
void insert(int x)
{
int i, j, news[30];
for (i = 1; i <= x; i++) news[i] = s[i];
i--;
for (j = 1; j <= k; j++) news[i + j] = lant[j];
j--;
for (i = x + 1; i <= l; i++) news[i + j] = s[i];
l += k;
for (int i = 1; i <= l; i++) s[i] = news[i];
}
int primul()
{
for (int i = 1; i <= l; i++)
if (grad(s[i]) > 0)
{pr = i; return s[i];}
return 0;
}
void ciclu ()
{
int x;
st = primul();
for (int i = 1; i <= n; i++) if (transa[st][i] > 0) {fi = i; break;}
for (int i = 1; i <= n; i++) d[i].st=0;
d[st].st = 1; x = st;
transa[st][fi] = transa[fi][st] = 0;
do
{
for(int i = 1; i <= n; i++)
if(transa[x][i] !=0 && d[i].st == 0)
{
d[i].st = 1; d[i].sursa = x;
}
d[x].st = 2;
k = 1;
while (d[k].st != 1) k++;
x = k;
} while (x != fi);
k = 1;
lant[k] = fi;
while (x != st)
{
x = d[x].sursa;
k++;
lant[k] = x;
}
}
int main()
{
readdata();
if (verif() == 0) {cout << "Graful nu este eulerian " << endl; return 0;}
lan();
print(l);
do {
exclude_cic();
if (exist() != 0)
{
ciclu();
insert(pr);
print(l);
}
} while (exist() > 0);
return 0;
}