Link to this code: https://cses.fi/paste/4509e30fc5b85bc0cdf1b4/
#include <bits/stdc++.h>
using namespace std;

#define rep(i, a, b) for(ll i = a; i < (b); ++i)
#define all(x) begin(x), end(x)
#define sz(x) (int)(x).size()
#define F first
#define S second
#define pb push_back
typedef long long ll;
typedef pair<int,int> pii;
typedef vector<int> vi;

bool has(vi& v, int x){
	int j = lower_bound(all(v),x)-v.begin();
	return j<sz(v) && v[j] == x;
}

int main() {
	cin.tie(0)->sync_with_stdio(0);
	cin.exceptions(cin.failbit);
	int n,m;cin>>n>>m;
	vector<vi> adj(n+2);
	rep(i,0,n+1)adj[i].pb(n+1);
	rep(i,0,n)adj[n].pb(i);
	rep(_,0,m){
		int a,b;cin>>a>>b;a--;b--;
		adj[a].pb(b);
	}
	rep(i,0,n+2)sort(all(adj[i]));
	vi id(n+2,0);
	rep(i,0,n+2) for(int x : adj[i]) id[x]++;
	vi o;
	rep(i,0,n+2)if(id[i]==0)o.pb(i);
	rep(j,0,n+2) for(int con : adj[o[j]]) if(--id[con] ==0) o.pb(con);
	vi r(n+2);rep(i,0,n+2)r[o[i]]=i;
	vi ps(n+2,0);
	rep(i,0,n+1)ps[i+1]=ps[i]+has(adj[o[i]],o[i+1]);
	vi nex(n+2,-2);
	nex[n]=-1;
	for(int i = n-1; i>=0; i--){
		int x = o[i];
		for(int y : adj[x])if(r[y]>i+1 && nex[r[y]-1]!=-2 && ps[r[y]-1]-ps[i+1]==(r[y]-2-i)) nex[i]=r[y]-1;
	}
	int loc = 0;
	if(nex[loc]==-2){
		cout<<"NO\n";
		return 0;
	}
	vi toggles={0};
	while(true){
		toggles.pb(loc+1);
		if(nex[loc]==-1) break;
		loc=nex[loc];
	}
	vi ans(n+2,0);
	rep(i,1,sz(toggles))rep(j,toggles[i-1],toggles[i]) ans[j]=i%2;
	vector<vi> paths(2);
	rep(i,1,n+1) paths[ans[i]].pb(o[i]);
	cout<<"YES\n";
	rep(i,0,2){
		cout<<sz(paths[i]);
		for(int x : paths[i])cout<<' '<<x+1;
		cout<<'\n';
	}
}