using
System;
using
System.Collections;
using
System.Collections.Generic;
class
GFG{
static
ArrayList ans;
static
int
flag = 1;
static
int
dfs(ArrayList adj,
int
[] order,
int
[] bridge_detect,
bool
[] mark,
int
v,
int
l)
{
mark[v] =
true
;
order[v] = order[l] + 1;
bridge_detect[v] = order[v];
for
(
int
i = 0;
i < ((ArrayList)adj[v]).Count;
i++)
{
int
u = (
int
)((ArrayList)adj[v])[i];
if
(u == l)
{
continue
;
}
if
(order[v] < order[u])
{
continue
;
}
if
(mark[u])
{
bridge_detect[v] = Math.Min(order[u],
bridge_detect[v]);
}
else
{
dfs(adj, order, bridge_detect,
mark, u, v);
}
bridge_detect[v] = Math.Min(bridge_detect[u],
bridge_detect[v]);
ans.Add(
new
int
[]{v, u});
}
if
(bridge_detect[v] == order[v] && l != 0)
{
flag = 0;
}
return
flag;
}
static
void
convert(ArrayList adj,
int
n)
{
int
[] order =
new
int
[n];
int
[] bridge_detect =
new
int
[n];
bool
[]mark =
new
bool
[n];
int
flag = dfs(adj, order,
bridge_detect,
mark, 1, 0);
if
(flag == 0)
{
Console.Write(
"-1"
);
}
else
{
foreach
(
int
[] it
in
ans)
{
Console.WriteLine(it[0] +
"->"
+
it[1]);
}
}
}
static
void
createGraph(
int
[,]Edges,
ArrayList adj,
int
M)
{
for
(
int
i = 0; i < M; i++)
{
int
u = Edges[i, 0];
int
v = Edges[i, 1];
((ArrayList)adj[u]).Add(v);
((ArrayList)adj[v]).Add(u);
}
}
public
static
void
Main(
string
[] args)
{
int
N = 5, M = 6;
int
[,]Edges = { { 0, 1 }, { 0, 2 },
{ 1, 2 }, { 1, 4 },
{ 2, 3 }, { 3, 4 } };
ArrayList adj =
new
ArrayList();
ans =
new
ArrayList();
for
(
int
i = 0; i < N; i++)
adj.Add(
new
ArrayList());
createGraph(Edges, adj, M);
convert(adj, N);
}
}