#include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; typedef long long int ll; typedef pair P; typedef pair Pi; typedef pair PP; const ll MOD=1e9+7; int n; vector g[100000]; int e[100000]; int sz[100000]; bool used[100000]; Pi p[100000]; void dfs(int x){ sz[x]=1; used[x]=1; for(auto pr:g[x]){ int y=pr.first; if(used[y]) continue; p[y]=Pi(x, pr.second); dfs(y); sz[x]+=sz[y]; } } int num[100000]; int nume[100000]; int ind[100000]; vector v[100000]; Pi nump[100000]; int ct; void dfs2(int x){ int mx=0, y0=-1; for(auto pr:g[x]){ int y=pr.first; if(y==p[x].first) continue; if(mx x[100000][2][2]; int m[100000]; void init(){ for(int i=0; i<=ct; i++){ if(v[i].empty()) continue; m[i]=1; while(m[i]0){ k=(k-1)/2; for(int s=0; s<2; s++){ for(int t=0; t<2; t++){ x[i0][s][t][k]=0; for(int u=0; u<2; u++){ x[i0][s][t][k]+=(x[i0][s][u][2*k+1]*x[i0][u][t][2*k+2]); x[i0][s][t][k]%=MOD; } } } } } void matmul(ll x1[2][2], ll x2[2][2], ll ans[2][2]){ for(int s=0; s<2; s++){ for(int t=0; t<2; t++){ ans[s][t]=0; for(int u=0; u<2; u++){ ans[s][t]+=(x1[s][u]*x2[u][t]); ans[s][t]%=MOD; } } } } void find(int i0, int a, int b, int k, int l, int r, ll ans[2][2]){ if(v[i0].empty() || r<=a || b<=l){ ans[0][0]=1, ans[1][1]=1, ans[0][1]=0, ans[1][0]=0; return; } if(a<=l && r<=b){ for(int s=0; s<2; s++){ for(int t=0; t<2; t++){ ans[s][t]=x[i0][s][t][k]; } } return; } ll ansl[2][2], ansr[2][2]; find(i0, a, b, 2*k+1, l, (l+r)/2, ansl); find(i0, a, b, 2*k+2, (l+r)/2, r, ansr); matmul(ansl, ansr, ans); } int main() { cin>>n; for(int i=0; i>a>>b; g[a].push_back(Pi(b, i)); g[b].push_back(Pi(a, i)); } ll x0[100000][2][2]; for(int i=0; i>q; init(); for(int i=0; i>c; if(c=='x'){ int e; cin>>e; cin>>x0[e][0][0]>>x0[e][0][1]>>x0[e][1][0]>>x0[e][1][1]; if(ind[e]>=0) update(e, x0[e][0][0], x0[e][0][1], x0[e][1][0], x0[e][1][1]); }else{ int v1, v2; cin>>v1>>v2; ll ans[2][2]; if(num[v1]==num[v2]){ int i1, i2; i2=ind[p[v2].second]+1; if(v1==0 || num[p[v1].first]!=num[v1]) i1=0; else i1=ind[p[v1].second]+1; find(num[v2], i1, i2, 0, 0, m[num[v2]], ans); cout<