#include using i64 = long long; using u64 = unsigned long long; using u32 = unsigned; using u128 = unsigned __int128; using i128 = __int128; std::set roots; struct DSU { std::vector f; DSU() {} DSU(int n) { init(n); } void init(int n) { f.resize(n); std::iota(f.begin(), f.end(), 0); } int find(int x) { while (x != f[x]) { x = f[x] = f[f[x]]; } return x; } bool merge(int x, int y) { x = find(x); y = find(y); if (x == y) { return false; } f[y] = x; roots.erase(y); return true; } int get_root(int x) { return find(x); } }; int main() { std::ios::sync_with_stdio(false); std::cin.tie(nullptr); int N, Q; std::cin >> N >> Q; for (int i = 0; i < N; i++) { roots.insert(i); } DSU dsu(N); while (Q--) { int op; std::cin >> op; if (op == 1) { int u, v; std::cin >> u >> v; u--; v--; dsu.merge(u, v); } else { int u; std::cin >> u; u--; int fa = dsu.get_root(u); if (roots.size() == 1) { std::cout << -1 << '\n'; } else { auto it = roots.begin(); if (*it == fa) { std::cout << *(++it) + 1 << '\n'; } else { std::cout << *it + 1 << '\n'; } } } } return 0; }