import
java.util.*;
public
class
Main {
static
int
tim =
0
;
static
ArrayList<Integer>[] G;
static
int
[] disc, fin;
static
int
[] Par;
static
char
[] Color;
static
void
DFS_Visit(
int
v) {
Color[v] =
'G'
;
tim +=
1
;
disc[v] = tim;
for
(
int
i =
0
; i < G[v].size(); i++) {
int
it = G[v].get(i);
if
(Color[it] ==
'W'
) {
Par[it] = v;
DFS_Visit(it);
}
}
Color[v] =
'B'
;
tim = tim +
1
;
fin[v] = tim;
}
static
void
DFS(ArrayList<Integer>[] graph) {
Par =
new
int
[graph.length];
disc =
new
int
[graph.length];
fin =
new
int
[graph.length];
Color =
new
char
[graph.length];
for
(
int
i =
1
; i < graph.length; i++) {
Color[i] =
'W'
;
Par[i] =
0
;
disc[i] =
0
;
fin[i] =
0
;
}
for
(
int
i =
1
; i < graph.length; i++) {
if
(Color[i] ==
'W'
) {
DFS_Visit(i);
}
}
}
static
boolean
checkOverlap(
int
x,
int
y) {
int
x1 = disc[x], y1 = fin[x];
int
x2 = disc[y], y2 = fin[y];
if
(x2 > x1 && y1 > y2) {
return
true
;
}
else
{
return
false
;
}
}
static
String checkEdge(
int
x,
int
y) {
if
(Par[y] == x) {
return
"Tree Edge"
;
}
else
if
(checkOverlap(x, y)) {
return
"Forward Edge"
;
}
else
if
(checkOverlap(y, x)) {
return
"Backward Edge"
;
}
else
{
return
"Cross Edge"
;
}
}
static
void
solve(
int
[][] arr,
int
N,
int
M) {
G =
new
ArrayList[N +
1
];
for
(
int
i =
0
; i < N +
1
; i++) {
G[i] =
new
ArrayList<Integer>();
}
for
(
int
i =
0
; i < M; i++) {
int
x = arr[i][
0
];
int
y = arr[i][
1
];
G[x].add(y);
}
DFS(G);
for
(
int
i =
0
; i < M; i++) {
int
x = arr[i][
0
];
int
y = arr[i][
1
];
System.out.println(
"("
+ x +
","
+ y +
")->"
+ checkEdge(x, y));
}
}
public
static
void
main(String[] args) {
int
N =
5
;
int
M =
7
;
int
[][] arr= {{
1
,
2
} , {
1
,
3
}, {
3
,
4
} , {
1
,
4
}, {
2
,
5
} , {
5
,
1
}, {
3
,
1
}};
solve(arr, N, M);
}
}