#include "islands.h"
#ifdef LOCAL
#include "grader.cpp"
#endif
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define iint signed
#define REP(i,n) for(int i=0;i<(n);i++)
#define REP1(i,n) for(int i=1;i<=(n);i++)
#define RREP(i,n) for(int i=(n)-1;i>=0;i--)
#define RREP1(i,n) for(int i=(n);i>=1;i--)
#define f first
#define s second
#define pb push_back
#define ALL(x) (x).begin(),(x).end()
#define SZ(x) ((int)((x).size()))
#define pii pair<int,int>
#define Graph vector<vector<int>>
#define Graphw vector<vector<pii>>
template<typename S> void chmin(S &x,S y) { x=min(x,y); }
template<typename S> void chmax(S &x,S y) { x=max(x,y); }
#define Vi vector<int>
#define Vpii vector<pii>
#ifdef LOCAL
#define op(x) cout<<(#x)<<"="<<(x)<<", ";
#define ope(x) cout<<(#x)<<"="<<(x)<<endl;
#define oparr(x) {cout<<(#x)<<":";for(auto allen:(x)) cout<<allen<<" ";cout<<" size="<<(x).size()<<endl;}
#define entr cout<<endl;
#else
#define op(x) ;
#define ope(x) ;
#define oparr(x) ;
#define entr ;
#endif
template<typename S>
ostream& operator<<(ostream& os,vector<S> p) { for(auto allen:p) os<<allen<<' ';return os<<'\n'; }
template<typename S>
istream& operator>>(istream& os,vector<S> &p) { for(auto &allen:p) os>>allen;return os; }
std::variant<bool, std::vector<iint>> find_journey(
iint N, iint M, std::vector<iint> U, std::vector<iint> V) {
int n=N,m=M;
Graphw g(n);
REP(i,m) {
g[U[i]].pb({V[i],i});
}
Vi _vis(n);
int root=0;
Vi an0;
while((root==0&&SZ(g[root])==1)||SZ(g[root])==4) {
_vis[root]=1;
for(auto [x,id]:g[root]) if(!_vis[x]) root=x,an0.pb(id);
}
ope(root)oparr(_vis)oparr(an0)
Vi dep(n,-1);
Vi vis=_vis;
Vi an;
auto dfs=[&](auto dfs,int u,int fa,int inv) ->void{
vis[u]=1;
for(auto [v,id]:g[u]) {
if(_vis[v]) continue;
if(v==fa) continue;
if(vis[v]) {
if(dep[v]>dep[u]) {
op(u)ope(v)
an.pb(id^inv);
an.pb(id^1^inv);
}
continue;
}
dep[v]=dep[u]+1;
an.pb(id^inv);
dfs(dfs,v,u,inv);
an.pb(id^1^inv);
}
};
dfs(dfs,root,-1,0);
vis=_vis;
dfs(dfs,root,-1,1);
oparr(an0)
oparr(an)
if(SZ(an)==0) return false;
vector<iint> _an;
REP(i,SZ(an0)) _an.pb(an0[i]);
for(int x:an) an0.pb(x);
RREP(i,SZ(an0)) _an.pb(an0[i]);
return _an;
}
/*
4 8
0 1
1 0
1 2
2 1
1 3
3 1
2 3
3 2
*/