Link to this code: https://cses.fi/paste/47a7ef31a88787c6c3ca55/
# include <bits/stdc++.h>
using namespace std;
// # define int long long

vector<vector<int>> graph;
vector<bool> vis;
vector<int> par;

int bfs(int src, int dst) {
    queue<pair<int, int>> q;
    q.push({1, src});
    vis[src] = 1;
    while(!q.empty()) {
        auto [cur, node] = q.front();
        q.pop();
        if (node == dst) return cur;
        for (auto neig : graph[node]) {
            if (!vis[neig]) {
                vis[neig] = 1;
                q.push({cur + 1, neig});
                par[neig] = node;
            }
        }
    }
    return 0;
}

void solve() {
    int n, k, u, v; cin >> n >> k;
    graph.assign(n + 1, vector<int>());
    vis.assign(n + 1, 0);
    par.assign(n + 1, 0);
    par[0] = -1;
    while (k--) {
        cin >> u >> v;
        graph[u].push_back(v);
        graph[v].push_back(u);
    }

    int res = bfs(1, n);
    if (!res) {
        cout << "IMPOSSIBLE" << '\n';
        return;
    }

    vector<string> path;
    for (int node = n ; node > 0 ; node = par[node]) path.push_back(to_string(node));
    reverse(path.begin(), path.end());
    cout << res << '\n';
    for (auto x:path) cout << x << " ";
}

signed main() {
    solve();
    return 0;
}