using
System;
using
System.Collections.Generic;
class
GFG {
static
List<List<
int
>> g =
new
List<List<
int
>>();
static
int
[] deg =
new
int
[100];
static
Dictionary<Tuple<
int
,
int
>,
int
> m1 =
new
Dictionary<Tuple<
int
,
int
>,
int
>();
static
List<Tuple<
int
,
int
>> v =
new
List<Tuple<
int
,
int
>>();
static
void
addEdge(
int
u,
int
v)
{
deg[u]++;
deg[v]++;
g[u].Add(v);
g[v].Add(u);
}
static
bool
CheckEulerian(
int
n)
{
int
check = 0;
for
(
int
i = 1; i <= n; i++) {
if
(deg[i] % 2 != 0 || deg[i] == 0) {
check = 1;
break
;
}
}
if
(check == 1) {
return
false
;
}
return
true
;
}
static
void
DirectedEuler(
int
node, List<List<
int
>> g)
{
int
[,] m = {{1, 2}, {2, 5}, {5, 1}, {2, 4}, {4, 3}, {3, 2}};
for
(
int
i = 0; i < g[node].Count; i++) {
if
(!m1.ContainsKey(
new
Tuple<
int
,
int
>(node, g[node][i]))
|| !m1.ContainsKey(
new
Tuple<
int
,
int
>(g[node][i], node)))
continue
;
m1[
new
Tuple<
int
,
int
>(node, g[node][i])] = 1;
v.Add(
new
Tuple<
int
,
int
>(node, g[node][i]));
DirectedEuler(g[node][i], g);
}
for
(
int
i = 0; i < m.GetLength(0); i++)
{
Console.WriteLine(m[i,0] +
" "
+ m[i,1]);
}
}
static
void
ConvertDirectedEuler(
int
n,
int
e)
{
if
(!CheckEulerian(n)) {
Console.Write(
"NOT POSSIBLE"
);
return
;
}
DirectedEuler(1, g);
for
(
int
i = 0; i < v.Count; i++) {
Console.WriteLine(v[i].Item1 +
" "
+ v[i].Item2);
}
}
static
void
Main() {
for
(
int
i = 0; i < 100; i++)
{
g.Add(
new
List<
int
>());
}
int
N = 5;
int
E = 6;
addEdge(1, 2);
addEdge(1, 5);
addEdge(5, 2);
addEdge(2, 4);
addEdge(2, 3);
addEdge(4, 3);
ConvertDirectedEuler(N, E);
}
}