CSES - Shared codeLink to this code: https://cses.fi/paste/53327aa5958567ef56df6a/
import java.io.PrintWriter;
import java.util.*;
public class MailDelivery {
public static void main(String args[]) throws Exception {
Scanner sc = new Scanner(System.in);
PrintWriter pw = new PrintWriter(System.out);
new MailDelivery().solve(sc, pw);
sc.close();
pw.flush();
pw.close();
System.exit(0);
}
void solve(Scanner sc, PrintWriter pw) throws Exception {
int n = sc.nextInt();
int m = sc.nextInt();
ArrayDeque<Integer> adj[] = new ArrayDeque[n];
for (int i = 0; i < n; i++) {
adj[i] = new ArrayDeque<>();
}
for (int i = 0; i < m; i++) {
int u = sc.nextInt() - 1;
int v = sc.nextInt() - 1;
adj[u].add(v);
adj[v].add(u);
}
ArrayList<Integer> circuit = new ArrayList<>(n+1);
int oddCount = 0;
for (int i = 0; i < n; i++) {
if(adj[i].size()%2 == 1){
oddCount++;
}
}
// System.out.println(oddCount);
if(oddCount != 0 ){
System.out.println("IMPOSSIBLE");
return;
}
ArrayDeque<Integer> s = new ArrayDeque<>();
s.push(0);
int curr_v = 0;
int g[][] = new int[n][n];
boolean flag = false;
while (!s.isEmpty()) {
flag = false;
while(adj[curr_v].size() > 0) {
//System.out.println(curr_v);
int next_v = adj[curr_v].pop();
if(g[curr_v][next_v] == 1){
continue;
}
flag = true;
s.push(curr_v);
g[curr_v][next_v] = 1;
g[next_v][curr_v] = 1;
curr_v = next_v;
}
if(!flag){
circuit.add(curr_v + 1);
curr_v = s.pop();
}
}
for (int i = 0; i < n; i++) {
if(adj[i].size() > 0){
System.out.println("IMPOSSIBLE");
}
}
for (int i = 0; i < circuit.size(); i++) {
if (i == 0) {
System.out.print(circuit.get(i));
} else {
System.out.print(" " + circuit.get(i));
}
}
System.out.println();
}
}