#include <iostream>
#include <vector>
#include <algorithm>
#define ll long long
using namespace std;
typedef pair<int, int> ii;
const ll MX = 2e5+10, LG = 20;
vector<vector<ii> > adj(MX);
ll p[LG][MX];
ll g[MX], rk[MX], sz[MX];
ll d[MX], depth[MX];
void init(ll x) {
g[x] = x;
rk[x] = 0;
sz[x] = 1;
d[x] = 0;
depth[x] = 0;
}
ll find(ll x) {
return (g[x] == x ? x : g[x] = find(g[x]));
}
void merge(ll x, ll y) {
ll GX = find(x), GY = find(y);
if (rk[GX] > rk[GY]) {
g[GY] = GX;
sz[GX] += sz[GY];
}
else {
g[GX] = GY;
sz[GY] += sz[GX];
}
if (rk[GX] == rk[GY]) {
rk[GY]++;
}
}
ll size(ll x) {
return sz[find(x)];
}
vector<int> vertices;
void dfs(ll u, ll prev) {
vertices.push_back(u);
for (ll i = 0; i < adj[u].size(); i++) {
ll v = adj[u][i].first;
if (v != prev) {
depth[v] = depth[u]+1;
d[v] = d[u]+adj[u][i].second;
dfs(v, u);
}
}
}
ll LCA(ll u, ll v) {
if (find(u) != find(v)) {
return -1;
}
if (depth[u] > depth[v]) {
swap(u, v);
}
for (ll i = LG-1; i >= 0; i--) {
if ((int)(1<<i) <= depth[v]-depth[u]) {
v = p[i][v];
}
}
if (u == v) return u;
for (ll i = LG-1; i >= 0; i--) {
if (p[i][u] != p[i][v]) {
u = p[i][u];
v = p[i][v];
}
}
return p[0][u];
}
ll dist(ll u, ll v) {
if (find(u) != find(v)) {
return -1;
}
ll lca = LCA(u, v);
return d[u]+d[v]-2*d[lca];
}
void dominate(ll u, ll v, ll c) {
ll cur = v, parent = p[0][cur];
while (parent != -1) {
ll nw = p[0][parent];
p[0][parent] = cur;
cur = parent;
parent = nw;
}
p[0][v] = u;
vertices.clear();
depth[v] = depth[u]+1;
d[v] = d[u]+c;
dfs(v, v);
for (ll i = 1; i < LG; i++) {
for (ll j = 0; j < vertices.size(); j++) {
ll k = vertices[j];
if (p[i-1][k] != -1) {
p[i][k] = p[i-1][p[i-1][k]];
}
else {
p[i][k] = -1;
}
}
}
}
int main() {
ios_base::sync_with_stdio(false); cin.tie(0);
ll n, q; cin >> n >> q;
for (ll i = 0; i < MX; i++) {
init(i);
}
for (ll i = 0; i < LG; i++) for (ll j = 0; j < MX; j++) {
p[i][j] = -1;
}
ll ans = 0;
while (q--) {
ll tp, u, v, c;
cin >> tp >> u >> v;
u = (u+ans)%n+1;
v = (v+ans)%n+1;
if (tp == 1) {
cin >> c;
if (size(u) < size(v)) {
swap(u, v);
}
dominate(u, v, c);
adj[u].push_back(ii(v, c));
adj[v].push_back(ii(u, c));
merge(u, v);
}
else {
cout << dist(u, v) << '\n';
ans = dist(u, v);
}
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8YWxnb3JpdGhtPgojZGVmaW5lIGxsIGxvbmcgbG9uZwp1c2luZyBuYW1lc3BhY2Ugc3RkOwp0eXBlZGVmIHBhaXI8aW50LCBpbnQ+IGlpOwpjb25zdCBsbCBNWCA9IDJlNSsxMCwgTEcgPSAyMDsKdmVjdG9yPHZlY3RvcjxpaT4gPiBhZGooTVgpOwpsbCBwW0xHXVtNWF07CmxsIGdbTVhdLCBya1tNWF0sIHN6W01YXTsKbGwgZFtNWF0sIGRlcHRoW01YXTsKIAp2b2lkIGluaXQobGwgeCkgewoJZ1t4XSA9IHg7Cglya1t4XSA9IDA7Cglzelt4XSA9IDE7CglkW3hdID0gMDsKCWRlcHRoW3hdID0gMDsKfQogCmxsIGZpbmQobGwgeCkgewoJcmV0dXJuIChnW3hdID09IHggPyB4IDogZ1t4XSA9IGZpbmQoZ1t4XSkpOwp9CiAKdm9pZCBtZXJnZShsbCB4LCBsbCB5KSB7CglsbCBHWCA9IGZpbmQoeCksIEdZID0gZmluZCh5KTsKCWlmIChya1tHWF0gPiBya1tHWV0pIHsKCQlnW0dZXSA9IEdYOwoJCXN6W0dYXSArPSBzeltHWV07Cgl9CgllbHNlIHsKCQlnW0dYXSA9IEdZOwoJCXN6W0dZXSArPSBzeltHWF07Cgl9CglpZiAocmtbR1hdID09IHJrW0dZXSkgewoJCXJrW0dZXSsrOwoJfQp9CiAKbGwgc2l6ZShsbCB4KSB7CglyZXR1cm4gc3pbZmluZCh4KV07Cn0KIAp2ZWN0b3I8aW50PiB2ZXJ0aWNlczsKdm9pZCBkZnMobGwgdSwgbGwgcHJldikgewoJdmVydGljZXMucHVzaF9iYWNrKHUpOwoJZm9yIChsbCBpID0gMDsgaSA8IGFkalt1XS5zaXplKCk7IGkrKykgewoJCWxsIHYgPSBhZGpbdV1baV0uZmlyc3Q7CgkJaWYgKHYgIT0gcHJldikgewoJCQlkZXB0aFt2XSA9IGRlcHRoW3VdKzE7CgkJCWRbdl0gPSBkW3VdK2Fkalt1XVtpXS5zZWNvbmQ7CgkJCWRmcyh2LCB1KTsKCQl9Cgl9Cn0KIApsbCBMQ0EobGwgdSwgbGwgdikgewoJaWYgKGZpbmQodSkgIT0gZmluZCh2KSkgewoJCXJldHVybiAtMTsKCX0KCWlmIChkZXB0aFt1XSA+IGRlcHRoW3ZdKSB7CgkJc3dhcCh1LCB2KTsKCX0KCWZvciAobGwgaSA9IExHLTE7IGkgPj0gMDsgaS0tKSB7CgkJaWYgKChpbnQpKDE8PGkpIDw9IGRlcHRoW3ZdLWRlcHRoW3VdKSB7CgkJCXYgPSBwW2ldW3ZdOwoJCX0KCX0KCWlmICh1ID09IHYpIHJldHVybiB1OwoJZm9yIChsbCBpID0gTEctMTsgaSA+PSAwOyBpLS0pIHsKCQlpZiAocFtpXVt1XSAhPSBwW2ldW3ZdKSB7CgkJCXUgPSBwW2ldW3VdOwoJCQl2ID0gcFtpXVt2XTsKCQl9Cgl9CglyZXR1cm4gcFswXVt1XTsKfQogCmxsIGRpc3QobGwgdSwgbGwgdikgewoJaWYgKGZpbmQodSkgIT0gZmluZCh2KSkgewoJCXJldHVybiAtMTsKCX0KCWxsIGxjYSA9IExDQSh1LCB2KTsKCXJldHVybiBkW3VdK2Rbdl0tMipkW2xjYV07Cn0KIAp2b2lkIGRvbWluYXRlKGxsIHUsIGxsIHYsIGxsIGMpIHsKCWxsIGN1ciA9IHYsIHBhcmVudCA9IHBbMF1bY3VyXTsKCXdoaWxlIChwYXJlbnQgIT0gLTEpIHsKCQlsbCBudyA9IHBbMF1bcGFyZW50XTsKCQlwWzBdW3BhcmVudF0gPSBjdXI7CgkJY3VyID0gcGFyZW50OwoJCXBhcmVudCA9IG53OwoJfQoJcFswXVt2XSA9IHU7Cgl2ZXJ0aWNlcy5jbGVhcigpOwoJZGVwdGhbdl0gPSBkZXB0aFt1XSsxOwoJZFt2XSA9IGRbdV0rYzsKCWRmcyh2LCB2KTsKCQoJZm9yIChsbCBpID0gMTsgaSA8IExHOyBpKyspIHsKCQlmb3IgKGxsIGogPSAwOyBqIDwgdmVydGljZXMuc2l6ZSgpOyBqKyspIHsKCQkJbGwgayA9IHZlcnRpY2VzW2pdOwoJCQlpZiAocFtpLTFdW2tdICE9IC0xKSB7CgkJCQlwW2ldW2tdID0gcFtpLTFdW3BbaS0xXVtrXV07CgkJCX0KCQkJZWxzZSB7CgkJCQlwW2ldW2tdID0gLTE7CgkJCX0KCQl9Cgl9Cn0KIAppbnQgbWFpbigpIHsKCWlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOyBjaW4udGllKDApOwoJbGwgbiwgcTsgY2luID4+IG4gPj4gcTsKCWZvciAobGwgaSA9IDA7IGkgPCBNWDsgaSsrKSB7CgkJaW5pdChpKTsKCX0KCWZvciAobGwgaSA9IDA7IGkgPCBMRzsgaSsrKSBmb3IgKGxsIGogPSAwOyBqIDwgTVg7IGorKykgewoJCXBbaV1bal0gPSAtMTsKCX0KCWxsIGFucyA9IDA7Cgl3aGlsZSAocS0tKSB7CgkJbGwgdHAsIHUsIHYsIGM7CgkJY2luID4+IHRwID4+IHUgPj4gdjsKCQl1ID0gKHUrYW5zKSVuKzE7CgkJdiA9ICh2K2FucyklbisxOwoJCWlmICh0cCA9PSAxKSB7CgkJCWNpbiA+PiBjOwoJCQlpZiAoc2l6ZSh1KSA8IHNpemUodikpIHsKCQkJCXN3YXAodSwgdik7CgkJCX0KCQkJZG9taW5hdGUodSwgdiwgYyk7CgkJCWFkalt1XS5wdXNoX2JhY2soaWkodiwgYykpOwoJCQlhZGpbdl0ucHVzaF9iYWNrKGlpKHUsIGMpKTsKCQkJbWVyZ2UodSwgdik7CgkJfQoJCWVsc2UgewoJCQljb3V0IDw8IGRpc3QodSwgdikgPDwgJ1xuJzsKCQkJYW5zID0gZGlzdCh1LCB2KTsKCQl9Cgl9CglyZXR1cm4gMDsKfSA=