#include #include using namespace atcoder; using namespace std; using ll = long long; using ld = long double; using pll = pair; using int128 = __int128; using State = string::const_iterator; class ParseError {}; #define rep(i, n) for(ll i = 0; i < (n); i++) #define reps(i, l, r) for(ll i = (l); i < (r); i++) #define all(a) (a).begin(), (a).end() #define rall(a) (a).rbegin(), (a).rend() // #define endl "\n"; const ll INF = LLONG_MAX / 4; const ld inf = numeric_limits::max() / (ld)4; const ll mod1 = 1000000007; const ll mod2 = 998244353; const ld pi = 3.1415926535897; ll dx[8] = {1, 1, 0, -1, -1, -1, 0, 1}; ll dy[8] = {0, -1, -1, -1, 0, 1, 1, 1}; template bool chmax(T &a, const T& b) { if (a < b) { a = b; return true; } return false; } template bool chmin(T &a, const T& b) { if (a > b) { a = b; return true; } return false; } const string TERM_RED = "\033[31m"; const string TERM_RESET = "\033[0m"; template void dump(const T &val) { cerr << TERM_RED << "[[ DEBUG ]] " << val << TERM_RESET << std::endl; } using pii = pair; using vb = vector; using vvb = vector; template using vec = vector; int solve() { int n, q; cin >> n >> q; dsu uf(n); vec queries; vec ans(q, 0); vec> waiting(n); rep(i, q) { int t; cin >> t; if(t == 1) { int u, v; cin >> u >> v; u--; v--; if(uf.same(u, v)) continue; for(auto e : waiting[uf.leader(u)]) { ans[e] = v+1; } waiting[u].clear(); for(auto e : waiting[uf.leader(v)]) { ans[e] = u+1; } waiting[v].clear(); uf.merge(u, v); } else { int v; cin >> v; v--; if(uf.size(v) == n) ans[i] = -1; else waiting[uf.leader(v)].push_back(i); } } rep(i, n) { if(uf.same(0, i)) continue; cout << i << endl; for(auto e : waiting[0]) { ans[e] = i+1; } waiting[0].clear(); for(auto e : waiting[i]) { ans[e] = 1; } waiting[i].clear(); uf.merge(0, i); } rep(i, q) { if(ans[i] != 0) cout << ans[i] << endl; } return 0; } int main(){ cin.tie(nullptr); ios_base::sync_with_stdio(false); cout << fixed << setprecision(20); int t = 1; while(t) { // dump("case"); t = solve(); } }