#include <cstdio>
#include <cstdlib>
const int MAXN = 50;	// 最大顶点数
int mat[MAXN][MAXN];	// 无向图的邻接矩阵
bool visited[MAXN];		// 标记顶点是否被访问过的数组
int n;					// 顶点的个数
void DFS(int node) {
	visited[node] = true;
	printf("%d ", node);
	for (int i = 0;i < n;i++) {
		if (!visited[i] && mat[node][i] == 1) {
		// 找到了下一个可以访问的顶点
			DFS(i);
		}
	}
}
int main() {
	scanf("%d", &n);
	for (int i = 0;i < n;i++) {
	// 读入无向图的邻接矩阵
		for (int j = 0;j < n;j++) {
			scanf("%d", &mat[i][j]);
		}
	}
	for (int i = 0;i < n;i++)
		visited[i] = false;
	for (int i = 0;i < n;i++) {
		if (!visited[i]) {
		// 找到了一个新的连通块
			DFS(i);
			puts("");
		}
	}
	return 0;
}
/**************************************************************
	Problem: 2161
	User: admin
	Language: C++
	Result: Accepted
	Time:15 ms
	Memory:1156 kb
****************************************************************/