By @AFewSuns
#include<bits/stdc++.h>
using namespace std;
using namespace my_std;
#define mod 1000000007
ll n,q,jc[200020],jcinv[200020],invv[200020],sum[200020],tree[200020];
il ll lowbit(ll x){
return x&(-x);
}
il void mdf(ll x,ll v){
if(v<0) v=-v;
else v=invv[v];
while(x<=n){
tree[x]=tree[x]*v%mod;
x+=lowbit(x);
}
}
il ll query(ll x){
ll res=1;
while(x){
res=res*tree[x]%mod;
x-=lowbit(x);
}
return res;
}
il void solve(ll x,ll y,ll t){
sum[x]-=t;
ll len=(y-x+n)%n-1;
swap(x,y);
x=x%n+1;
y=(y+n-2)%n+1;
if(x<=y){
mdf(x,t*len);
mdf(y+1,-t*len);
}
else{
mdf(x,t*len);
mdf(1,t*len);
mdf(y+1,-t*len);
}
}
int main(){
n=read();
q=read();
jc[0]=1;
fr(i,1,n) jc[i]=jc[i-1]*i%mod;
jcinv[n]=inv(jc[n],mod);
pfr(i,n-1,0) jcinv[i]=jcinv[i+1]*(i+1)%mod;
fr(i,1,n) invv[i]=jcinv[i]*jc[i-1]%mod;
fr(i,1,n) sum[i]=n-3;
fr(i,1,n) tree[i]=1;
fr(i,1,n-3){
ll x=read(),y=read();
solve(x,y,1);
solve(y,x,1);
}
while(q--){
ll opt=read();
if(opt==1){
ll x=read(),y=read(),xx=read(),yy=read();
solve(x,y,-1);
solve(y,x,-1);
solve(xx,yy,1);
solve(yy,xx,1);
}
else{
ll x=read();
pf("%lld %lld\n",sum[x],jc[sum[x]]*query(x)%mod);
}
}
}
