package com.example.codingtest
import java.io.BufferedReader
import java.io.InputStreamReader
import java.util.LinkedList
import java.util.Queue
import java.util.Stack
fun main() {
val br = BufferedReader(InputStreamReader(System.`in`))
val (n, m,v) = readLine()!!.split(" ").map { it.toInt() }
val graph = Array(1001, { IntArray(10001, { 0 }) })
// Array(크기, {IntArray(크기, {초기화 값})}
val visited = BooleanArray(n + 1)
visited.fill(false)
for (i in 1..m) {
val (x, y) = readLine()!!.split(" ").map { it.toInt() }
graph[x][y] = 1 //연결되어있음을 표시
graph[y][x] = 1 //연결되어있음을 표시
}
val stack=Stack<Int>()
stack.push(v)
visited[v]=true
val sb=StringBuilder()
sb.append("${v} ")
while(stack.isNotEmpty()){ // 스택이 빌떄까지
val peek_v=stack.peek()
var check=1
for(i in 1..n){
if((graph[peek_v][i]==1)&&(visited[i]!=true)){
stack.push(i)
visited[i]=true
check=0
sb.append("${i} ")
break
}
}
if(check==1){
stack.pop()
}
}
println(sb.toString())
sb.setLength(0);
visited.fill(false)
var queue: Queue<Int> = LinkedList() // 큐로 선언하고 LinkedList 로 할당
queue.add(v)
visited[v] = true
sb.append("${v} ")
while (queue.isNotEmpty()) { // 스택이 빌떄까지.
val peek_v = queue.poll() // 1 검사
for (i in 1..n) {
if ((graph[peek_v][i] == 1) && (visited[i] != true)) {
queue.add(i)
visited[i] = true
sb.append("${i} ")
}
}
}
print(sb.toString())
}