#include <bits/stdc++.h>
using namespace std;
int n, m, v;
vector<int> adj[1001]; // 인접 리스트
bool visited[1001];
void dfs(int node) {
visited[node] = true;
cout << node << ' ';
for (auto next_node : adj[node]) { // 선택한 노드의 인접 노드를 탐색
if (!visited[next_node]) { // 인접 노드에 아직 방문하지 않았다면
dfs(next_node); // 그 노드로 깊이 파고 듦
}
}
}
void bfs(int node) {
queue<int> q;
visited[node] = true;
cout << node << ' ';
q.push(node);
while (!q.empty()) {
node = q.front();
q.pop();
for (auto next_node : adj[node]) {
if (!visited[next_node]) {
visited[next_node] = true;
cout << next_node << ' ';
q.push(next_node);
}
}
}
}
void solve() {
cin >> n >> m >> v;
for (int i = 0; i < m; ++i) { // 간선 정보를 통해 인접 리스트 구성
int a, b;
cin >> a >> b;
adj[a].push_back(b);
adj[b].push_back(a);
}
// 번호가 낮은 순으로 방문하기 위해 정렬
for (int i = 1; i <= n; ++i) {
sort(adj[i].begin(), adj[i].end());
}
dfs(v);
cout << '\n';
memset(visited, false, sizeof(visited)); // bfs 호출 전 visited 배열 초기화
bfs(v);
cout << '\n';
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
solve();
return 0;
}