import
java.io.*;
import
java.util.*;
class
GFG
{
static
void
randomOrderDfs(
int
i,
ArrayList<ArrayList<Integer> > adj,
boolean
[] visited, Stack<Integer> stk)
{
visited[i] =
true
;
for
(
int
j =
0
; j < adj.get(i).size(); j++) {
int
child = adj.get(i).get(j);
if
(visited[child] ==
false
) {
randomOrderDfs(child, adj, visited, stk);
}
}
stk.push(i);
}
static
void
dfs2(
int
i,
ArrayList<ArrayList<Integer> > adj,
boolean
[] visited)
{
visited[i] =
true
;
for
(
int
j =
0
; j < adj.get(i).size(); j++) {
int
child = adj.get(j).get(
0
);
if
(visited[child] ==
false
) {
dfs2(child, adj, visited);
}
}
}
static
boolean
isTourPossible(
int
n,
int
[][] roads)
{
ArrayList<ArrayList<Integer> > adj1
=
new
ArrayList<>();
ArrayList<ArrayList<Integer> > adj2
=
new
ArrayList<>();
;
for
(
int
i =
0
; i < n; i++) {
adj1.add(
new
ArrayList<Integer>());
adj2.add(
new
ArrayList<Integer>());
}
for
(
int
i =
0
; i < n; i++) {
adj1.get(roads[i][
0
]).add(roads[i][
1
]);
}
boolean
[] visited1 =
new
boolean
[n];
boolean
[] visited2 =
new
boolean
[n];
for
(
int
i =
0
; i < n; i++) {
visited1[i] =
false
;
visited2[i] =
false
;
}
Stack<Integer> stk =
new
Stack<Integer>();
for
(
int
i =
0
; i < n; i++) {
if
(visited1[i] ==
false
) {
randomOrderDfs(i, adj1, visited1, stk);
}
}
for
(
int
i =
0
; i < n; i++) {
for
(
int
j =
0
; j < adj1.get(i).size(); j++) {
int
child = adj1.get(i).get(j);
adj2.get(child).add(i);
}
}
int
scc =
0
;
while
(stk.size() >
0
) {
int
node = stk.peek();
if
(visited2[node]) {
stk.pop();
}
else
{
dfs2(node, adj2, visited2);
stk.pop();
scc++;
if
(scc >
1
)
return
false
;
}
}
return
true
;
}
public
static
void
main(String[] args)
{
int
N =
2
;
int
edges[][] = { {
0
,
1
}, {
1
,
0
} };
boolean
result = isTourPossible(N, edges);
if
(result) {
System.out.println(
"True"
);
}
else
{
System.out.println(
"False"
);
}
}
}