import
java.io.*;
import
java.util.*;
class
GFG {
static
void
add_edge(ArrayList<ArrayList<Integer>> adj,
int
src,
int
dest){
adj.get(src).add(dest);
adj.get(dest).add(src);
}
static
void
find_paths(ArrayList<ArrayList<Integer>> paths, ArrayList<Integer> path,
ArrayList<ArrayList<Integer>> parent,
int
n,
int
u) {
if
(u == -
1
) {
paths.add(
new
ArrayList<>(path));
return
;
}
for
(
int
par : parent.get(u)) {
path.add(u);
find_paths(paths, path, parent, n, par);
path.remove(path.size()-
1
);
}
}
static
void
bfs(ArrayList<ArrayList<Integer>> adj, ArrayList<ArrayList<Integer>> parent,
int
n,
int
start) {
int
[] dist =
new
int
[n];
Arrays.fill(dist, Integer.MAX_VALUE);
Queue<Integer> q =
new
LinkedList<>();
q.offer(start);
parent.get(start).clear();
parent.get(start).add(-
1
);
dist[start] =
0
;
while
(!q.isEmpty()) {
int
u = q.poll();
for
(
int
v : adj.get(u)) {
if
(dist[v] > dist[u] +
1
) {
dist[v] = dist[u] +
1
;
q.offer(v);
parent.get(v).clear();
parent.get(v).add(u);
}
else
if
(dist[v] == dist[u] +
1
) {
parent.get(v).add(u);
}
}
}
}
static
void
print_paths(ArrayList<ArrayList<Integer>> adj,
int
n,
int
start,
int
end){
ArrayList<ArrayList<Integer>> paths =
new
ArrayList<>();
ArrayList<Integer> path =
new
ArrayList<>();
ArrayList<ArrayList<Integer>> parent =
new
ArrayList<>();
for
(
int
i =
0
; i < n; i++){
parent.add(
new
ArrayList<>());
}
bfs(adj, parent, n, start);
find_paths(paths, path, parent, n, end);
for
(ArrayList<Integer> v : paths) {
Collections.reverse(v);
for
(
int
u : v)
System.out.print(u +
" "
);
System.out.println();
}
}
public
static
void
main (String[] args)
{
int
n =
6
;
ArrayList<ArrayList<Integer>> adj =
new
ArrayList<>();
for
(
int
i =
0
; i < n; i++){
adj.add(
new
ArrayList<>());
}
add_edge(adj,
0
,
1
);
add_edge(adj,
0
,
2
);
add_edge(adj,
1
,
3
);
add_edge(adj,
1
,
4
);
add_edge(adj,
2
,
3
);
add_edge(adj,
3
,
5
);
add_edge(adj,
4
,
5
);
int
src =
0
;
int
dest = n -
1
;
print_paths(adj, n, src, dest);
}
}