#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace std;
using namespace __gnu_pbds;
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define fbo find_by_order
#define ook order_of_key
typedef long long ll;
typedef pair<ll,ll> ii;
typedef vector<int> vi;
typedef long double ld;
typedef tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update> pbds;
typedef set<int>::iterator sit;
typedef map<int,int>::iterator mit;
typedef vector<int>::iterator vit;
const int LG = 18;
const int N = 200010;
int st[LG][N];
ll h[N];
ll sumh[N];
vector<ii> adj[N];
vector<ii> adj2[N];
int sum[N];
int rt(int u)
{
for(int i = LG - 1; i >= 0; i--)
{
if(st[i][u]!=-1) u=st[i][u];
}
return u;
}
void merge(int u, int v)
{
u = rt(u); v = rt(v);
if(u == v) return ;
sum[u]+=sum[v];
sum[v]=0;
}
int lca(int u, int v)
{
if(h[u] > h[v]) swap(u, v);
for(int i = LG - 1; i >= 0; i--)
{
if(st[i][v] != -1 && h[st[i][v]] >= h[u])
{
v = st[i][v];
}
}
if(u == v) return u;
for(int i = LG - 1; i >= 0; i--)
{
if(st[i][v] != -1 && st[i][v] != st[i][u])
{
u = st[i][u];
v = st[i][v];
}
}
return st[0][u];
}
bool sameset(int u, int v)
{
return (rt(u)==rt(v));
}
ll dist(int u, int v)
{
if(sameset(u,v)) return (sumh[u] + sumh[v] - sumh[lca(u,v)]*2LL);
else return -1;
}
void dfs(int u, int p, int nw, int hh, ll sm)
{
adj[u].clear();
if(p == -1)
{
h[u] = hh;
sumh[u] = sm;
}
else
{
h[u] = h[p] + 1;
}
if(p == -1) st[0][u] = nw;
else st[0][u] = p;
for(int i = 1; i < LG; i++)
{
if(st[i-1][u] == -1) st[i][u] = -1;
else st[i][u] = st[i-1][st[i-1][u]];
}
for(int i = 0; i < adj2[u].size(); i++)
{
int v = adj2[u][i].fi; ll w = adj2[u][i].se;
if(v==p) continue;
if(p==-1&&v==nw) continue;
sumh[v] = sumh[u] + w;
adj[u].pb(mp(v, w));
dfs(v, u, nw, hh, sm);
}
}
void join(int u, int v, ll w) //order is important here
{
if(sum[rt(u)]<sum[rt(v)]) swap(u, v);
//cerr<<sum[rt(u)]<<' '<<sum[rt(v)]<<'\n';
merge(u,v);
dfs(v, -1, u, h[u] + 1, sumh[u] + w);
adj2[u].pb(mp(v,w)); adj2[v].pb(mp(u,w));
adj[u].pb(mp(v,w));
}
int main()
{
ios_base::sync_with_stdio(0); cin.tie(0);
int n, q;
cin>>n>>q;
memset(st,-1,sizeof(st));
for(int i = 0; i < n; i++) sum[i] = 1;
ll lastans = 0;
for(int i = 0; i < q; i++)
{
int t, u, v;
cin>>t>>u>>v;
u=(u+lastans)%n + 1;
v=(v+lastans)%n + 1;
u--; v--;
//cerr<<"U V : "<<u+1<<' '<<v+1<<'\n';
if(t==1)
{
ll w; cin >> w;
assert(rt(u)!=rt(v));
join(u,v,w);
//cout<<"DONE\n";
}
else
{
ll aa = dist(u,v);
cout<<aa<<'\n';
lastans = (aa%n);
if(aa<0) aa+=n;
}
}
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiNpbmNsdWRlIDxleHQvcGJfZHMvYXNzb2NfY29udGFpbmVyLmhwcD4KI2luY2x1ZGUgPGV4dC9wYl9kcy90cmVlX3BvbGljeS5ocHA+CiAKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKdXNpbmcgbmFtZXNwYWNlIF9fZ251X3BiZHM7CiAKI2RlZmluZSBmaSBmaXJzdAojZGVmaW5lIHNlIHNlY29uZAojZGVmaW5lIG1wIG1ha2VfcGFpcgojZGVmaW5lIHBiIHB1c2hfYmFjawojZGVmaW5lIGZibyBmaW5kX2J5X29yZGVyCiNkZWZpbmUgb29rIG9yZGVyX29mX2tleQogCnR5cGVkZWYgbG9uZyBsb25nIGxsOwp0eXBlZGVmIHBhaXI8bGwsbGw+IGlpOwp0eXBlZGVmIHZlY3RvcjxpbnQ+IHZpOwp0eXBlZGVmIGxvbmcgZG91YmxlIGxkOyAKdHlwZWRlZiB0cmVlPGludCwgbnVsbF90eXBlLCBsZXNzPGludD4sIHJiX3RyZWVfdGFnLCB0cmVlX29yZGVyX3N0YXRpc3RpY3Nfbm9kZV91cGRhdGU+IHBiZHM7CnR5cGVkZWYgc2V0PGludD46Oml0ZXJhdG9yIHNpdDsKdHlwZWRlZiBtYXA8aW50LGludD46Oml0ZXJhdG9yIG1pdDsKdHlwZWRlZiB2ZWN0b3I8aW50Pjo6aXRlcmF0b3Igdml0OwogCmNvbnN0IGludCBMRyA9IDE4Owpjb25zdCBpbnQgTiA9IDIwMDAxMDsKaW50IHN0W0xHXVtOXTsKbGwgaFtOXTsKbGwgc3VtaFtOXTsKdmVjdG9yPGlpPiBhZGpbTl07CnZlY3RvcjxpaT4gYWRqMltOXTsKaW50IHN1bVtOXTsKIAppbnQgcnQoaW50IHUpCnsKCWZvcihpbnQgaSA9IExHIC0gMTsgaSA+PSAwOyBpLS0pCgl7CgkJaWYoc3RbaV1bdV0hPS0xKSB1PXN0W2ldW3VdOwoJfQoJcmV0dXJuIHU7Cn0KIAp2b2lkIG1lcmdlKGludCB1LCBpbnQgdikKewoJdSA9IHJ0KHUpOyB2ID0gcnQodik7CglpZih1ID09IHYpIHJldHVybiA7CglzdW1bdV0rPXN1bVt2XTsKCXN1bVt2XT0wOwp9CiAKaW50IGxjYShpbnQgdSwgaW50IHYpCnsKCWlmKGhbdV0gPiBoW3ZdKSBzd2FwKHUsIHYpOwoJZm9yKGludCBpID0gTEcgLSAxOyBpID49IDA7IGktLSkKCXsKCQlpZihzdFtpXVt2XSAhPSAtMSAmJiBoW3N0W2ldW3ZdXSA+PSBoW3VdKQoJCXsKCQkJdiA9IHN0W2ldW3ZdOwoJCX0KCX0KCWlmKHUgPT0gdikgcmV0dXJuIHU7Cglmb3IoaW50IGkgPSBMRyAtIDE7IGkgPj0gMDsgaS0tKQoJewoJCWlmKHN0W2ldW3ZdICE9IC0xICYmIHN0W2ldW3ZdICE9IHN0W2ldW3VdKQoJCXsKCQkJdSA9IHN0W2ldW3VdOwoJCQl2ID0gc3RbaV1bdl07CgkJfQoJfQoJcmV0dXJuIHN0WzBdW3VdOwp9CiAKYm9vbCBzYW1lc2V0KGludCB1LCBpbnQgdikKewoJcmV0dXJuIChydCh1KT09cnQodikpOwp9CiAKbGwgZGlzdChpbnQgdSwgaW50IHYpCnsKCWlmKHNhbWVzZXQodSx2KSkgcmV0dXJuIChzdW1oW3VdICsgc3VtaFt2XSAtIHN1bWhbbGNhKHUsdildKjJMTCk7CgllbHNlIHJldHVybiAtMTsKfQogCnZvaWQgZGZzKGludCB1LCBpbnQgcCwgaW50IG53LCBpbnQgaGgsIGxsIHNtKQp7CglhZGpbdV0uY2xlYXIoKTsKCWlmKHAgPT0gLTEpIAoJewoJCWhbdV0gPSBoaDsKCQlzdW1oW3VdID0gc207Cgl9CgllbHNlCgl7CgkJaFt1XSA9IGhbcF0gKyAxOwoJfQoJaWYocCA9PSAtMSkgc3RbMF1bdV0gPSBudzsKCWVsc2Ugc3RbMF1bdV0gPSBwOwoJZm9yKGludCBpID0gMTsgaSA8IExHOyBpKyspCgl7CgkJaWYoc3RbaS0xXVt1XSA9PSAtMSkgc3RbaV1bdV0gPSAtMTsKCQllbHNlIHN0W2ldW3VdID0gc3RbaS0xXVtzdFtpLTFdW3VdXTsKCX0KCWZvcihpbnQgaSA9IDA7IGkgPCBhZGoyW3VdLnNpemUoKTsgaSsrKQoJewoJCWludCB2ID0gYWRqMlt1XVtpXS5maTsgbGwgdyA9IGFkajJbdV1baV0uc2U7CgkJaWYodj09cCkgY29udGludWU7CgkJaWYocD09LTEmJnY9PW53KSBjb250aW51ZTsKCQlzdW1oW3ZdID0gc3VtaFt1XSArIHc7CgkJYWRqW3VdLnBiKG1wKHYsIHcpKTsKCQlkZnModiwgdSwgbncsIGhoLCBzbSk7Cgl9CQp9CiAKdm9pZCBqb2luKGludCB1LCBpbnQgdiwgbGwgdykgLy9vcmRlciBpcyBpbXBvcnRhbnQgaGVyZQp7CglpZihzdW1bcnQodSldPHN1bVtydCh2KV0pIHN3YXAodSwgdik7CgkvL2NlcnI8PHN1bVtydCh1KV08PCcgJzw8c3VtW3J0KHYpXTw8J1xuJzsKCW1lcmdlKHUsdik7CglkZnModiwgLTEsIHUsIGhbdV0gKyAxLCBzdW1oW3VdICsgdyk7CglhZGoyW3VdLnBiKG1wKHYsdykpOyBhZGoyW3ZdLnBiKG1wKHUsdykpOwoJYWRqW3VdLnBiKG1wKHYsdykpOwp9CiAKaW50IG1haW4oKQp7Cglpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKDApOyBjaW4udGllKDApOwoJaW50IG4sIHE7IAoJY2luPj5uPj5xOwoJbWVtc2V0KHN0LC0xLHNpemVvZihzdCkpOwoJZm9yKGludCBpID0gMDsgaSA8IG47IGkrKykgc3VtW2ldID0gMTsKCWxsIGxhc3RhbnMgPSAwOwoJZm9yKGludCBpID0gMDsgaSA8IHE7IGkrKykKCXsKCQlpbnQgdCwgdSwgdjsKCQljaW4+PnQ+PnU+PnY7CgkJdT0odStsYXN0YW5zKSVuICsgMTsKCQl2PSh2K2xhc3RhbnMpJW4gKyAxOwoJCXUtLTsgdi0tOwoJCS8vY2Vycjw8IlUgViA6ICI8PHUrMTw8JyAnPDx2KzE8PCdcbic7CgkJaWYodD09MSkKCQl7CgkJCWxsIHc7IGNpbiA+PiB3OwoJCQlhc3NlcnQocnQodSkhPXJ0KHYpKTsKCQkJam9pbih1LHYsdyk7CgkJCS8vY291dDw8IkRPTkVcbiI7CgkJfQoJCWVsc2UKCQl7CgkJCWxsIGFhID0gZGlzdCh1LHYpOwoJCQljb3V0PDxhYTw8J1xuJzsKCQkJbGFzdGFucyA9IChhYSVuKTsKCQkJaWYoYWE8MCkgYWErPW47CgkJfQoJfQp9CiA=