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();
}