#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include // C++ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include // #include #define _GLIBCXX_DEBUG #define rep(i, n) for(int i=0;i<(int)(n);i++) #define pb push_back #define pob pop_back #define eb emplace_back #define nall(a) a.begin(),a.end() #define rall(a) a.rbegin(),a.rend() #define yesno(a) cout<<(a?"YES\n":"NO\n") #define accu accumulate #define bs binary_search #define lb lower_bound #define ub upper_bound #define yes cout<<"YES\n" #define no cout<<"NO\n" using namespace std; using ll = long long; using ull = unsigned long long; using pii = pair; using pll = pair; template using pq = priority_queue; template using pqg = priority_queue, greater>; template using vec = vector; template using vv = vector>; template using vvv = vector>; const ll MOD = 998244353ll; // const ll MOD = 1000000007ll; struct dsu{ vector par; vector sz; dsu(int n){ par.resize(n); sz.assign(n, 1); for (int i = 0; i < n; i++) par[i] = i; } int root(int x){ if (par[x] == x) return x; return par[x] = root(par[x]); } void merge(int x, int y){ x = root(x); y = root(y); if (x == y) return; if (sz[x] < sz[y]) swap(x, y); par[y] = x; sz[x] += sz[y]; return; } bool same(int x, int y){ return root(x) == root(y); } int size(int x){ return sz[root(x)]; } }; void solve(); int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); cout << fixed << setprecision(20); int t = 1; // cin >> t; while (t--) solve(); return 0; } void solve(){ int N, Q, M; cin >> N >> Q, M = N; dsu G(N); vv H(N); set I; rep(i, N){ I.insert(i); H[i].push_back(i); } while (Q--){ int t; cin >> t; if (t == 1){ int u, v; cin >> u >> v; u = G.root(u-1); v = G.root(v-1); if (G.same(u, v)) continue; G.merge(u, v); int r = G.root(u); if (r == v) swap(u, v); if (H[u].size() < H[v].size()) swap(H[u], H[v]); for (int x : H[v]) H[u].push_back(x); H[v].clear(); I.erase(v); M--; } else{ int u; cin >> u; if (M == 1){ cout << -1 << endl; continue; } u = G.root(u-1); auto it = next(I.find(u)); if (it == I.end()) it = I.begin(); cout << H[*it][0]+1 << endl; } } }