const mod=1000000007; typedef struct{ long long a,b,c; char o; }abc; abc C[1<<18]; idx[1<<16]; CN; N,Q,X,Y; char T; abc op(char o,abc A,abc B){ abc R; if(o){ if(A.b>=0){ if(B.b>=0){ R.a=A.a; R.b=(A.b+A.c*B.a+B.b)%mod; R.c=B.c; }else{ R.a=A.a; R.b=A.b; R.c=A.c*-B.b%mod; } }else{ if(B.b>=0){ R.a=-A.b*B.a%mod; R.b=B.b; R.c=B.c; }else{ R.b=-(-A.b*-B.b%mod); } } }else{ if(A.b>=0){ if(B.b>=0){ R.a=A.a; R.b=(A.b+A.c+B.a+B.b)%mod; R.c=B.c; }else{ R.a=A.a; R.b=(A.b+A.c)%mod; R.c=-B.b; } }else{ if(B.b>=0){ R.a=-A.b; R.b=(B.a+B.b)%mod; R.c=B.c; }else{ R.a=-A.b; R.b=0; R.c=-B.b; } } } R.o=o; return R; } d(i){ if(i<65536){ d(i*2); if(CN1)r(i/2); } main(){ scanf("%d%*c",&N); d(1); scanf("%d%*c",&Q); for(;Q--;){ scanf("%c%d%d%*c",&T,&X,&Y); int x=idx[X],y=idx[Y]; if(T=='!'){ abc t=C[x];C[x]=C[y];C[y]=t; r(x>>X%2); r(y>>Y%2); }else{ abc t=C[x],u=C[y]; for(;x/2