#include using namespace std; using ll = long long; #define rep(i, s, e) for (int i = (int)(s); i < (int)(e); ++i) struct UnionFind { vector par; set leader; int group; UnionFind(int N) : par(N, -1), group(N) { rep(i, 0, N) leader.insert(i); } int root(int x) { if (par[x] < 0) return x; else return par[x] = root(par[x]); } bool merge(int x, int y) { if ((x = root(x)) == (y = root(y))) return false; if (par[x] > par[y]) swap(x, y); par[x] += par[y]; par[y] = x; leader.erase(y); --group; return true; } bool same(int x, int y) { return root(x) == root(y); } }; int main() { cin.tie(nullptr); ios_base::sync_with_stdio(false); int N, Q; cin >> N >> Q; UnionFind uf(N); rep(query, 0, Q) { int ord; cin >> ord; if (ord == 1) { int u, v; cin >> u >> v; --u, --v; uf.merge(u, v); } else { int v; cin >> v; --v; if (uf.group == 1) cout << -1 << '\n'; else { for (int u : uf.leader) if (!uf.same(v, u)) { cout << u + 1 << '\n'; break; } } } } }