ベッシーは、ファームの新しい時計-牛に任命されています。毎晩、それは農場を歩いて渡ると何の掟に背く者はどんな悪をやっていないことを確認するために、彼女の仕事です。彼女は、納屋から始まり、彼女のパトロールを行い、その後、彼女は完了だ納屋に戻ります。
彼女はより注意深い牛だったら、彼女はちょうどMのそれぞれを歩くことができるかもしれない(1 <= M <= 50,000)双方向トレイルはN間1..Mを、番号(2 <= N <= 10,000)のフィールドは、1番..彼女は彼女が見る必要があるすべてのものを見ていますと確信一度農場のNとなります。彼女がいないので、しかし、彼女はちょうど2倍各トレイルを歩くことを確認したいと考えています。それは彼女が二度同じことを見逃さないように、それぞれの道に沿って彼女の2回の旅行は、反対方向にあることも重要です。
フィールドのペアは、複数の歩道で接続されることがあります。ベッシーは彼女の要件を満たしなる従うことができますパスを検索します。このようなパスが存在することが保証されています。
彼女はより注意深い牛だったら、彼女はちょうどMのそれぞれを歩くことができるかもしれない(1 <= M <= 50,000)双方向トレイルはN間1..Mを、番号(2 <= N <= 10,000)のフィールドは、1番..彼女は彼女が見る必要があるすべてのものを見ていますと確信一度農場のNとなります。彼女がいないので、しかし、彼女はちょうど2倍各トレイルを歩くことを確認したいと考えています。それは彼女が二度同じことを見逃さないように、それぞれの道に沿って彼女の2回の旅行は、反対方向にあることも重要です。
フィールドのペアは、複数の歩道で接続されることがあります。ベッシーは彼女の要件を満たしなる従うことができますパスを検索します。このようなパスが存在することが保証されています。
入力
* 1行目:二つの整数、N及びM.
*ライン2..M + 1:パスによって接続されたフィールドのペアを表す二つの整数。
*ライン2..M + 1:パスによって接続されたフィールドのペアを表す二つの整数。
出力
*行1..2M + 1:彼女が通過するフィールドのリストを1行に1つずつ、複数のソリューションが可能である場合開始し、フィールド1の納屋で終わる、出力任意のソリューション。
サンプル入力
4 5 1 2 1 4 2 3 2 4 3 4
サンプル出力
1 2 3 4 2 1 4 3 2 4 1
ヒント
OUTPUTの詳細:
ベッシーは、1(納屋)から始まる2になり、その後、3、等...
ベッシーは、1(納屋)から始まる2になり、その後、3、等...
考える:ソリューションを確保するために、対象オイラーパスを印刷、直接印刷することができDFS、次のように:
const int型 MAXM = 10010 ; const int型 MAXN = 50010 ; 構造体ノード{ INT からの、。 ノード(INT _from、INT _to)から(_from)、(_to){}を }。 int型 N、M、VIS [MAXN * 2 ]。 ベクター < INT > ANS、G [MAXM]。 ベクター <ノード> エッジ。 ボイド addedge(INT U、INT V){ edges.push_back(ノード(U、V))。 G [U] .push_back(edges.size()- 1 )。 } ボイド DFS(INT X){ int型 LEN = G [X] .size()。 以下のために(int型 i = 0 ; iがLEN <; ++ I){ 場合(!VIS [G [X] [I]]){ VIS [G [x]は[I] = 1 。 DFS(エッジ[G [X] [I]です。)。 ans.push_back(エッジ[G [X] [I]です。)。 } } } int型のmain(){ scanf関数(" %d個の%のD "、&N、&M)。 以下のための(int型私は=0 ; 私はMを<; ++ I){ int型T1、T2。 scanf関数(" %dの%のD "、&T1、およびT2)。 addedge(T1、T2)。 addedge(T2、T1)。 } DFS(1 )。 INT LEN = ans.size()。 以下のために(int型 i = 0 ; iがLEN <; ++ I) のprintf(" %Dを\ n " 、ANS [I])。 printf(" 1つの\ n " ); リターン 0 ; }