#include<bits/stdc++.h>
#define int long long
#define INPUT_DATA_TYPE long long
#define OUTPUT_DATA_TYPE long long
INPUT_DATA_TYPE read(){register INPUT_DATA_TYPE x=0;register char f=0,c=getchar();while(c<'0'||'9'<c)f=(c=='-'),c=getchar();while('0'<=c&&c<='9')x=(x<<3)+(x<<1)+(c&15),c=getchar();return f?-x:x;}void print(OUTPUT_DATA_TYPE x){register char s[20];register int i=0;if(x<0){x=-x;putchar('-');}if(x==0){putchar('0');return;}while(x){s[i++]=x%10;x/=10;}while(i){putchar(s[--i]+'0');}return;}
int par[3000010],siz[3000010];
long long ans[3000010],invfact[3000010],fact[3000010];
const long long mod=1000000007;
long long C(int n,int m){return fact[n]*invfact[n-m]%mod*invfact[m]%mod;}
long long qpow(register long long base,register long long e){
register long long res=1;
while(e){
if(e&1) (res*=base)%=mod;
(base*=base)%=mod;
e>>=1;
}
return res;
}
void build(int n){
register int i;
for(i=0;i<n;++i) par[i]=i,siz[i]=ans[i]=1;
return;
}
int find(int x){return x==par[x]?x:(par[x]=find(par[x]));}
void merge(int u,int v){
u=find(u),v=find(v);
siz[v]+=siz[u];
ans[v]=ans[u]*ans[v]%mod*C(siz[v]-1,siz[u])%mod;
par[u]=v;
return;
}
signed main(){
#ifndef ONLINE_JUDGE
freopen("name.in", "r", stdin);
freopen("name.out", "w", stdout);
#endif
register int i,op,u,v;
register long long latans=0;
int n=read();
build(n);
fact[0]=fact[1]=invfact[0]=invfact[1]=1;
for(i=2;i<=n;++i) fact[i]=fact[i-1]*i%mod;
invfact[n]=qpow(fact[n],mod-2);
for(i=n-1;i>1;--i) invfact[i]=invfact[i+1]*(i+1)%mod;
int q=read();
for(i=0;i<q;++i){
op=read();
if(op==1){
u=((read()+latans)%mod)%n;
v=((read()+latans)%mod)%n;
merge(u,v);
}else{
u=((read()+latans)%mod)%n;
latans=ans[find(u)]+mod;
latans%=mod;
latans+=mod;
latans%=mod;
print(latans);
putchar('\n');
}
}
#ifndef ONLINE_JUDGE
fclose(stdin);
fclose(stdout);
#endif
return 0;
}