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