#include<iostream>
#include<cstring>
using namespace std;
const int maxn=105;
int DFN[105];
int low[105];
int stack[105];
int flag[105];
struct Edge{int u,v;}edge[maxn];
int head[maxn],cnt;
inline void add(int u,int v){edge[++cnt].u=head[u],edge[cnt].v=v,head[u]=cnt;}
int number,count,j,top;
void tarjan(int u)
{
DFN[u]=low[u]=count++;
stack[++top]=u;
flag[u]=1;
for(int i=head[u]; i; i=edge[i].u)
{
int v=edge[i].v;
if(!DFN[v])
{
tarjan(v);
if(low[v]<low[u])low[u]=low[v];
}
else if(DFN[v]<low[u]&&flag[v])low[u]=DFN[v];
}
if(DFN[u]==low[u])
{
do
{
j=stack[top--];
cout<<j<<" ";
flag[j]=0;
}
while(j!=u);
cout<<endl;
}
}
int main()
{
add(1,2),add(1,3),add(4,1),add(2,4),add(3,6),add(3,5),add(3,4),add(4,6),add(5,6);
tarjan(1);
return 0;
}