#include using namespace std; using ll = long long; struct Unionfind { vector par, usiz; ll e = 0, v; Unionfind(ll n): par(n), usiz(n), v(n) { for(ll i = 0; i < n; i++) { par[i] = i; usiz[i] = 1; } } // ↓に"/"追加でコメントアウト解除 /** Unionfind(graph g): par(g()), usiz(g()), v(g()) { for(ll i = 0; i < v; i++) { par[i] = i; usiz[i] = 1; } for(ll i = 0; i < v; i++) { for(auto &j : g[i]) { if(i < j) unite(i, j); } } } /**/ ll root(ll x) { if(par[x] == x) return x; return par[x] = root(par[x]); } void unite(ll x, ll y) { x = root(x), y = root(y); if(x == y) return; if(usiz[x] > usiz[y]) swap(x, y); par[x] = y; usiz[y] += usiz[x]; e++; } void unite(pair x) { unite(x.first, x.second); } bool same(ll x, ll y) { return root(x) == root(y); } bool same(pair x) { return same(x.first, x.second); } ll size(ll x) { return usiz[root(x)]; } vector> group() { vector> r(v); for(ll i = 0; i < v; i++) r[root(i)].push_back(i); r.erase(remove_if(begin(r), end(r), [&](vector &r_) { return r_.empty(); })); return r; } ll operator[](ll i) { return root(i); } void operator()(ll x, ll y) { unite(x, y); } void operator()(pair x) { unite(x); } ll operator()() { return v - e; } }; int main() { ios::sync_with_stdio(false); cin.tie(0); ll n, Q; cin >> n >> Q; Unionfind u(n); set s; for(ll i = 0; i < n; i++) s.insert(i); while(Q--) { ll f; cin >> f; if(f == 1) { ll x, y; cin >> x >> y; x--, y--; ll rx = u[x], ry = u[y]; u.unite(x, y); if(u[x] == rx) s.erase(y); else s.erase(x); } else { ll v; cin >> v; v--; if(u() == 1) cout << -1 << "\n"; else { ll r = u[v]; for(auto &i : s) { if(u[i] != r) { cout << i + 1 << "\n"; break; } } } } } }