#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; using ll = long long; using vi = vector; using vvi = vector; using vl = vector; using vvl = vector; using vb = vector; using vvb = vector; using vd = vector; using vs = vector; using pii = pair; using pll = pair; using pdd = pair; using vpii = vector; using vpll = vector; using vpdd = vector; const int inf = (1 << 30) - 1; const ll INF = 1LL << 60; const int MOD = 1000000007; //const int MOD = 998244353; struct UnionFind { vector par; vector sizes; UnionFind(int n) : par(n), sizes(n, 1) { for (int i = 0; i < n; i++) par[i] = i; } int root(int x) { if (x == par[x]) return x; return par[x] = root(par[x]); } void unite(int x, int y) { x = root(x); y = root(y); if (x == y) return; if (sizes[x] < sizes[y]) swap(x, y); par[y] = x; sizes[x] += sizes[y]; } bool same(int x, int y) { return root(x) == root(y); } int size(int x) { return sizes[root(x)]; } }; int main() { int n, q; cin >> n >> q; UnionFind uf(n); vector> st(n); for (int i = 0; i < n; i++) { st[i].insert(i); } for (int i = 0; i < q; i++) { int t, u, v; cin >> t; if (t == 1) { cin >> u >> v; u--; v--; uf.unite(u, v); int r = uf.root(u); int p; if (r == u) p = v; else p = u; for (auto& x : st[p]) { st[r].insert(x); } } else { cin >> v; v--; int r = uf.root(v); if (st[r].size() == n) { cout << -1 << endl; continue; } if (*st[r].begin() != 0) cout << 1 << endl; else if (*st[r].rbegin() != n - 1) cout << n << endl; else { int cnt = 0; for (auto& x : st[r]) { if (x != cnt) { cout << cnt + 1 << endl; } cnt++; } } } } return 0; }