#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
****************************************************************/