#include #define L long long int #define I int #define R return using namespace std; const L m=1e9+7; struct M{L a,b,c,d;}; M operator*(M x,M y){R{(x.a*y.a+x.b*y.c)%m,(x.a*y.b+x.b*y.d)%m,(x.c*y.a+x.d*y.c)%m,(x.c*y.b+x.d*y.d)%m};} M u={1,0,0,1}; const I X=100010; M S[X*2]; I s,z,n,q,o; vector>T(X); vectorB(X,1),P(X,-1),H(X),D(X); pairE[X]; M G(I x,I y,I i=0,I l=0,I r=s){ if(r<=x||y<=l) R u; else if(x<=l&&r<=y) R S[i]; R G(x,y,i*2+1,l,(l+r)/2)*G(x,y,i*2+2,(l+r)/2,r); } I d1(I C,I p){ P[C]=p; I t=0; for(auto&N:T[C]){ if(N==p)continue; B[C]+=d1(N,C); if(B[N]>t){t=B[N];swap(N,T[C][0]);} } R B[C]; } I d2(I C){ D[C]=o++; for(auto&N:T[C]){ if(N==P[C])continue; H[N]=(N==T[C][0]?H[C]:N); d2(N); } } I main(){ cin>>n; s=1; while(s>a>>b; T[a].push_back(b); T[b].push_back(a); E[i]={a,b}; } cin>>q; d1(0,-1);d2(0); while(q--){ char c;cin>>c; if(c-'g'){ I i,x,y,z,w;cin>>i>>x>>y>>z>>w; auto[a,b]=E[i]; I k=P[a]==b?D[a]:D[b],l=k+s-1; S[l--]={x,y,z,w}; while(l>=0){S[l/2]=S[(l/2)*2+1]*S[(l/2)*2+2];(l/=2)--;} }else{ I i,j;cin>>i>>j; M a=u; while(1){ if(D[i]>D[j])swap(i,j); if(H[i]==H[j]){if(i!=j)a=G(D[i]+1,D[j]+1)*a;break;} a=G(D[H[j]],D[j]+1)*a; j=P[H[j]]; } cout<