// CT.CPP
#include <iostream>
#include <vector>
#include <stack>
#include <sstream>
#include <string>
#include <algorithm> // for reverse
using namespace std;
const int MAX = 1005;
vector<int> adj[MAX];
int inDeg[MAX], outDeg[MAX];
bool visited[MAX];
int n, start, option;
void dfs(int u) {
visited[u] = true;
for (int v : adj[u]) {
if (!visited[v]) dfs(v);
}
}
void dfsUndirected(int u, vector<vector<int>> &undirAdj) {
visited[u] = true;
for (int v : undirAdj[u]) {
if (!visited[v]) dfsUndirected(v, undirAdj);
}
}
bool isWeaklyConnected() {
vector<vector<int>> undirAdj(n + 1);
for (int u = 1; u <= n; ++u) {
for (int v : adj[u]) {
undirAdj[u].push_back(v);
undirAdj[v].push_back(u);
}
}
fill(visited, visited + n + 1, false);
int s = 1;
while (s <= n && adj[s].empty()) s++;
if (s > n) return false;
dfsUndirected(s, undirAdj);
for (int i = 1; i <= n; ++i) {
if ((!adj[i].empty() || inDeg[i] > 0) && !visited[i]) return false;
}
return true;
}
string checkEulerType() {
if (!isWeaklyConnected()) return "Khong phai do thi Euler hay nua Euler";
int startNodes = 0, endNodes = 0;
for (int i = 1; i <= n; ++i) {
if (outDeg[i] - inDeg[i] == 1) startNodes++;
else if (inDeg[i] - outDeg[i] == 1) endNodes++;
else if (inDeg[i] != outDeg[i]) return "Khong phai do thi Euler hay nua Euler";
}
if (startNodes == 0 && endNodes == 0)
return "Do thi Euler";
else if (startNodes == 1 && endNodes == 1)
return "Do thi nua Euler";
else
return "Khong phai do thi Euler hay nua Euler";
}
vector<int> findEulerPath(int u) {
vector<int> path;
stack<int> stk;
stk.push(u);
vector<vector<int>> tempAdj(MAX);
for (int i = 1; i <= n; ++i) tempAdj[i] = adj[i];
while (!stk.empty()) {
int curr = stk.top();
if (!tempAdj[curr].empty()) {
int next = tempAdj[curr].back();
tempAdj[curr].pop_back();
stk.push(next);
} else {
stk.pop();
path.push_back(curr);
}
}
reverse(path.begin(), path.end());
return path;
}
int main() {
cin >> option >> start >> n;
int u, v;
string line;
getline(cin, line); // consume leftover newline
while (getline(cin, line) && !line.empty()) {
istringstream iss(line);
iss >> u;
while (iss >> v) {
adj[u].push_back(v);
outDeg[u]++;
inDeg[v]++;
}
}
string result = checkEulerType();
if (option == 1) {
if (result == "Do thi Euler") cout << 0 << endl;
else if (result == "Do thi nua Euler") cout << 1 << endl;
else cout << 2 << endl;
} else if (option == 2 && result == "Do thi Euler") {
vector<int> cycle = findEulerPath(start);
for (int i = 0; i < (int)cycle.size(); ++i) {
cout << cycle[i];
if (i + 1 < cycle.size()) cout << " ";
}
cout << endl;
}
return 0;
}