#include <bits/stdc++.h>
using namespace std;
#define Long long long
#define bint __int128
#define _3bkarm cin.tie(NULL); cout.tie(NULL); ios::sync_with_stdio(false);
const int mod = 998244353;
vector<int> p, root;
vector<int> treeSize;
vector< set<int> > adj;
int update;
void dfs(int v) {
root[v] = update;
for (int u : adj[v]) {
if (u == p[v]) continue;
p[u] = v, dfs(u);
}
}
void get_shit_done() {
int n, q;
cin >> n >> q;
p.assign(n + 1, -1);
treeSize.assign(n + 1, 1);
adj.assign(n + 1, {});
root.assign(n + 1, -1);
for (int v = 1; v <= n; ++v) root[v] = v;
int x = 0;
while (q--) {
int a, b, c;
cin >> a >> b >> c;
a = 1 + (1LL * a * (1 + x) % mod) % 2;
b = 1 + (1LL * b * (1 + x) % mod) % n;
c = 1 + (1LL * c * (1 + x) % mod) % n;
if (a == 1) {
if ( treeSize[ root[b] ] < treeSize[ root[c] ] )
swap(b, c);
treeSize[ root[b] ] += treeSize[ root[c] ];
p[c] = b;
adj[b].insert(c);
adj[c].insert(b);
update = root[b], dfs(c);
} else {
if (p[b] == p[c] and p[b] != -1) x = p[b];
else if ( adj[b].count(p[c]) ) x = p[c];
else if ( adj[c].count(p[b]) ) x = p[b];
else x = 0;
cout << x << '\n';
}
}
}
signed main() {
_3bkarm
int ts = 1;
// cin >> ts;
while (ts--) {
get_shit_done();
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKI2RlZmluZSBMb25nIGxvbmcgbG9uZwojZGVmaW5lIGJpbnQgX19pbnQxMjgKI2RlZmluZSBfM2JrYXJtIGNpbi50aWUoTlVMTCk7IGNvdXQudGllKE5VTEwpOyBpb3M6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7Cgpjb25zdCBpbnQgbW9kID0gOTk4MjQ0MzUzOwoKdmVjdG9yPGludD4gcCwgcm9vdDsKdmVjdG9yPGludD4gdHJlZVNpemU7CnZlY3Rvcjwgc2V0PGludD4gPiBhZGo7CgppbnQgdXBkYXRlOwp2b2lkIGRmcyhpbnQgdikgewogICAgcm9vdFt2XSA9IHVwZGF0ZTsKICAgIGZvciAoaW50IHUgOiBhZGpbdl0pIHsKICAgICAgICBpZiAodSA9PSBwW3ZdKSBjb250aW51ZTsKICAgICAgICBwW3VdID0gdiwgZGZzKHUpOwogICAgfQp9Cgp2b2lkIGdldF9zaGl0X2RvbmUoKSB7CiAgICBpbnQgbiwgcTsKICAgIGNpbiA+PiBuID4+IHE7CgogICAgcC5hc3NpZ24obiArIDEsIC0xKTsKICAgIHRyZWVTaXplLmFzc2lnbihuICsgMSwgMSk7CiAgICBhZGouYXNzaWduKG4gKyAxLCB7fSk7CiAgICByb290LmFzc2lnbihuICsgMSwgLTEpOwogICAgZm9yIChpbnQgdiA9IDE7IHYgPD0gbjsgKyt2KSByb290W3ZdID0gdjsKCiAgICBpbnQgeCA9IDA7CiAgICB3aGlsZSAocS0tKSB7CiAgICAgICAgaW50IGEsIGIsIGM7CiAgICAgICAgY2luID4+IGEgPj4gYiA+PiBjOwoKICAgICAgICBhID0gMSArICgxTEwgKiBhICogKDEgKyB4KSAlIG1vZCkgJSAyOwogICAgICAgIGIgPSAxICsgKDFMTCAqIGIgKiAoMSArIHgpICUgbW9kKSAlIG47CiAgICAgICAgYyA9IDEgKyAoMUxMICogYyAqICgxICsgeCkgJSBtb2QpICUgbjsKCiAgICAgICAgaWYgKGEgPT0gMSkgewogICAgICAgICAgICBpZiAoIHRyZWVTaXplWyByb290W2JdIF0gPCB0cmVlU2l6ZVsgcm9vdFtjXSBdICkKICAgICAgICAgICAgICAgIHN3YXAoYiwgYyk7CiAgICAgICAgICAgIHRyZWVTaXplWyByb290W2JdIF0gKz0gdHJlZVNpemVbIHJvb3RbY10gXTsKICAgICAgICAgICAgcFtjXSA9IGI7CiAgICAgICAgICAgIGFkaltiXS5pbnNlcnQoYyk7CiAgICAgICAgICAgIGFkaltjXS5pbnNlcnQoYik7CiAgICAgICAgICAgIHVwZGF0ZSA9IHJvb3RbYl0sIGRmcyhjKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAocFtiXSA9PSBwW2NdIGFuZCBwW2JdICE9IC0xKSB4ID0gcFtiXTsKICAgICAgICAgICAgZWxzZSBpZiAoIGFkaltiXS5jb3VudChwW2NdKSApIHggPSBwW2NdOwogICAgICAgICAgICBlbHNlIGlmICggYWRqW2NdLmNvdW50KHBbYl0pICkgeCA9IHBbYl07CiAgICAgICAgICAgIGVsc2UgeCA9IDA7CiAgICAgICAgICAgIGNvdXQgPDwgeCA8PCAnXG4nOwogICAgICAgIH0KICAgIH0KfQoKc2lnbmVkIG1haW4oKSB7CiAgICBfM2JrYXJtCgogICAgaW50IHRzID0gMTsKLy8gICAgY2luID4+IHRzOwogICAgd2hpbGUgKHRzLS0pIHsKICAgICAgICBnZXRfc2hpdF9kb25lKCk7CiAgICB9CgogICAgcmV0dXJuIDA7Cn0=