#pragma GCC optimize("Ofast") #pragma GCC optimize("unroll-loops") #include // #include // using namespace atcoder; using namespace std; using ll = long long; using pll = pair; using vll = vector; using vvll = vector; using vpll = vector; using vvpll = vector; #define rep(i, l, r) for (ll i = l; i < ll(r); i++) #define rrep(i, l, r) for (ll i = ll(r-1); i >= l; i--) #pragma region // doubling template T fpow(T base, T id, ll exp, std::function bop); template T fpow(T base, ll exp); template T fpow(T base, ll exp) { T ans = 1; while (exp > 0) { if (exp & 1ll) { ans = ans * base; } base = base * base; exp >>= 1; } return ans; } template T fpow(T base, T id, ll exp, std::function bop) { T ans = id; while (exp > 0) { if (exp & 1ll) { ans = bop(ans, base); } base = bop(base, base); exp >>= 1; } return ans; } #pragma endregion #pragma region #pragma endregion #include using namespace atcoder; using mint = modint998244353; int main() { ll n, q; cin >> n >> q; atcoder::dsu uf(n); set s; rep(i, 0, n) s.insert(i); rep(i, 0, q) { ll t; cin >> t; if (t == 1) { ll u, v; cin >> u >> v; u--;v--; if (uf.same(u, v)) continue; u = uf.leader(u); v = uf.leader(v); uf.merge(u, v); ll newroot = uf.leader(u); if (newroot != u) swap(u, v); s.erase(v); } else { ll p; cin >> p; p--; if (s.size() == 1) { cout << -1 << endl; } else { ll u = *s.begin(), v = *(++s.begin()); p = uf.leader(p); if (u == p) { swap(u, v); } cout << u+1 << endl; } } } }