import java.util.*;
import java.io.*;
public class Main {
static ArrayList<Integer>[] graph;
static boolean[] visitedDFS;
static boolean[] visitedBFS;
static ArrayList<Integer> recordDFS = new ArrayList<>();
static ArrayList<Integer> recordBFS = new ArrayList<>();
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
int v = Integer.parseInt(st.nextToken());
graph = new ArrayList[n+1];
visitedDFS = new boolean[n+1];
visitedBFS = new boolean[n+1];
for(int i=1;i<n+1;i++) {
graph[i] = new ArrayList<>();
}
for(int i=0;i<m;i++) {
st = new StringTokenizer(br.readLine(), " ");
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
graph[a].add(b);
graph[b].add(a);
}
for(int i=1; i<n+1; i++) {
Collections.sort(graph[i]);
}
dfs(v);
bfs(v);
for(int k : recordDFS) {
bw.write(k+" ");
}
bw.write("\n");
for(int j : recordBFS) {
bw.write(j+" ");
}
bw.flush();
bw.close();
br.close();
}
public static void dfs(int start) {
visitedDFS[start] = true;
recordDFS.add(start);
for(int next : graph[start]) {
if(!visitedDFS[next]) {
dfs(next);
}
}
}
public static void bfs(int start) {
Queue<Integer> queue = new ArrayDeque<>();
queue.offer(start);
visitedBFS[start] = true;
recordBFS.add(start);
while(!queue.isEmpty()) {
int current = queue.poll();
for(int next : graph[current]) {
if(!visitedBFS[next]) {
visitedBFS[next] = true;
recordBFS.add(next);
queue.offer(next);
}
}
}
}
}
- Collections.sort(graph[i]); 정렬을 사용해서, 작은 노드부터 접근
- BFS는 재귀 사용하지 않고 Queue queue = new ArrayDeque<>(); 큐를 생성해서 접근 순서 관리