CSES - Shared codeLink to this code:
https://cses.fi/paste/f9d630a9cb939713531048/
#include <bits/stdc++.h>
using namespace std;
#define E 1e-9
#define PI 3.141592653589793238462
#define F first
#define S second
#define PB push_back
#define EB emplace_back
#define MP make_pair
#define INF 1e18
#define MOD 1000000007
#define SZ(a) int((a).size())
#define setbits(a) (__builtin_popcountll(a))
#define right(a) (__builtin_ctzll(a))
#define left(a) (__builtin_clzll(a))
#define parity(a) (__builtin_parityll(a))
#define msb(a) (__lg(a))
#define lsb(a) ((ll)(log2(a & -a)))
typedef std::numeric_limits<double> dbl;
typedef long long ll;
#define REP(i, a, b) for (ll i = a; i < b; i++)
typedef vector<ll> vi;
typedef pair<ll, ll> pi;
typedef pair<ll, pi> pii;
#define MAXV 1e6
vector<ll> Parent(MAXV), Rank(MAXV);
void Init(ll n)
{
REP(i, 1, n + 1)
{
Parent[i] = i;
Rank[i] = 1;
}
}
void Root(ll x, vi &res)
{
if (Parent[x] != x)
Root(Parent[x], res);
res.PB(x);
return;
}
void dfs(ll src, stack<ll> &st, vector<vector<ll>> &adj, vector<bool> &visited)
{
visited[src] = true;
for (auto &x : adj[src])
{
if (!visited[x])
dfs(x, st, adj, visited);
}
st.push(src);
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
ll n, m;
cin >> n >> m;
vector<vector<ll>> adj(n + 1);
for (ll i = 0; i < m; i++)
{
ll a, b;
cin >> a >> b;
adj[a].push_back(b);
}
stack<ll> st;
vector<bool> visited(n + 1, false);
dfs(1, st, adj, visited);
vector<ll> dp(n + 1, -1);
Init(n);
dp[1] = dp[0] = 0;
while (!st.empty())
{
for (auto &x : adj[st.top()])
{
if (dp[x] < 1 + dp[st.top()])
{
dp[x] = 1 + dp[st.top()];
Parent[x] = st.top();
}
}
st.pop();
}
if (dp[n] == -1)
cout << "IMPOSSIBLE\n";
else
{
vi res;
Root(n, res);
cout << SZ(res) << '\n';
for (auto &x : res)
cout << x << " ";
cout << '\n';
}
return 0;
}