CSES - Shared codeLink to this code:
https://cses.fi/paste/bc5d64c2532f469f2333c5/
#include<bits/stdc++.h>
#define ll long long
using namespace std;
void dfs(int s,vector<bool>& vis,stack<int>& S,vector<int>* G){
vis[s]=true;
for(auto x:G[s]){
if(!vis[x])
dfs(x,vis,S,G);
}
S.push(s);
}
// int cnt_cc(int s,vector<bool>& vis,vector<int>* G,int src,int dest){
// vis[s]=true;
// if(s==dest){
// return 1;
// }
// int ans=INT_MIN;
// for(auto x:G[s]){
// if(!vis[x]){
// ans=max(ans,dfs(x,vis,G,src,dest));
// }
// }
// return ans;
// }
void test_case(){
int n,m;
cin>>n>>m;
vector<int> G[n];
for(int i=0;i<m;i++){
int a,b;
cin>>a>>b;
--a;--b;
G[a].emplace_back(b);
}
vector<int> dp(n,INT_MIN);
vector<int> parent(n,-1);
int src=0;
int dest=n-1;
stack<int> S;
vector<int> tops;
vector<bool> vis(n,false);
dfs(src,vis,S,G);
while(!S.empty()){
tops.emplace_back(S.top());
S.pop();
}
for(auto x:tops){
for(auto s:G[x]){
if(dp[s]<dp[x]+1){
dp[s]=dp[x]+1;
parent[s]=x;
}
}
}
if(parent[n-1]==-1 || dp[n-1]==INT_MIN){
puts("IMPOSSIBLE");
return;
}
vector<int> ans;
for(int i=n-1;i>=0;){
ans.emplace_back(i+1);
i=parent[i];
}
reverse(ans.begin(),ans.end());
cout<<ans.size()<<"\n";
for(auto x:ans)
cout<<x<<" ";
puts("");
}
int main(){
test_case();
}