#include<bits/stdc++.h>
#define FILE "read"
#define MAXN 30010
const int mod=10007;
int n,Q,K[MAXN],B[MAXN],f[MAXN],dfn[MAXN],vis[MAXN],spf[MAXN],Ni[MAXN],son[MAXN][2];
inline int read(){
int x=0,f=1; char ch=getchar();
while(ch>'9'||ch<'0') {if(ch=='-') f=-1; ch=getchar();}
while(ch>='0'&&ch<='9') {x=x*10+ch-'0'; ch=getchar();}
return x*f;
}
inline int add(int a,int b){return (a+b)%mod;}
inline int sub(int a,int b){return (a-b)%mod;}
inline int mul(int a,int b){return (a*b)%mod;}
struct complex{
int k,b;
complex(int k=0,int b=0):k(k),b(b){}
inline complex operator +(complex &y){
return complex(mul(k,y.k),add(mul(b,y.k),y.b));
}
inline int calc(int x){return add(mul(k,x),b);}
}v[MAXN],sum[MAXN];
inline int power(int a,int b){
int ret(1);
while(b){
if(b&1) ret=mul(ret,a);
a=mul(a,a); b>>=1;
}return ret;
}
class Link_Cut_Tree{
private:
inline bool get(int x){return son[f[x]][1]==x;}
inline bool isroot(int x){return son[f[x]][0]!=x&&son[f[x]][1]!=x;}
inline void updata(int x){
sum[x]=v[x];
if(son[x][0]) sum[x]=sum[son[x][0]]+v[x];
if(son[x][1]) sum[x]=sum[x]+sum[son[x][1]];
}
inline void rotate(int x){
int y=f[x],z=f[y],which=get(x);
if(!isroot(y)) son[z][son[z][1]==y]=x;
son[y][which]=son[x][which^1]; f[son[x][which^1]]=y;
son[x][which^1]=y; f[y]=x; f[x]=z;
updata(y); updata(x);
}
inline void splay(int x){
for(int y=f[x];!isroot(x);rotate(x),y=f[x])
if(!isroot(y)) rotate(get(x)==get(y)?y:x);
}
inline void access(int x){
int last(0);
while(x){
splay(x);
son[x][1]=last;
updata(x);
last=x; x=f[x];
}
}
inline void linkk(int x,int y){
access(x); splay(x); f[x]=y;
}
inline void cut(int x){
access(x); splay(x); f[son[x][0]]=0; son[x][0]=0; updata(x);
}
inline int find(int x){
access(x); splay(x);
while(son[x][0]) x=son[x][0];
splay(x);
return x;
}
inline bool On_Circle(int x,int root){
int f=spf[root];
if(f==x) return 1;
access(f); splay(f); splay(x);
return !isroot(f);
}
public:
int query(int x){
access(x); splay(x); complex v1=sum[x];
int root=find(x),f=spf[root];
access(f); splay(f); complex v2=sum[f];
if(v2.k==1) return v2.b?-1:-2;
if(v2.k==0) return v1.calc(v2.b);
return v1.calc(sub(mod,mul(v2.b,Ni[v2.k-1])));
}
void solve(int x,int k,int p,int b){
access(x); splay(x); v[x]=sum[x]=complex(k,b); updata(x);
int root1=find(x);
if(x==root1){
if(find(p)==x) spf[x]=p;
else spf[x]=0,linkk(x,p);
}
else if(On_Circle(x,root1)){
cut(x); linkk(root1,spf[root1]); spf[root1]=0;
if(find(p)==x) spf[x]=p;
else linkk(x,p);
}
else{
cut(x);
if(find(p)==x) spf[x]=p;
else linkk(x,p);
}
}
}Tree;
void dfs(int x){
int y=f[x]; dfn[x]=vis[x]=1;
if(dfn[y]) spf[x]=y,f[x]=0;
if(!vis[y]) dfs(f[x]);
dfn[x]=0;
}
int main(){
freopen(FILE".in","r",stdin);
freopen(FILE".out","w",stdout);
n=read();
for(int i=1;i<=n;++i) K[i]=read(),f[i]=read(),B[i]=read();
for(int i=1;i<=n;++i) v[i]=sum[i]=complex(K[i],B[i]);
for(int i=1;i<=n;++i) if(!vis[i]) dfs(i);
for(int i=1;i<=n;++i) Ni[i]=power(i,mod-2);
Q=read();
for(int i=1;i<=Q;++i){
char ch[5]; scanf("%s",ch);
if(ch[0]=='A'){
int x=read();
printf("%d\n",Tree.query(x));
}
else if(ch[0]=='C'){
int a=read(),k=read(),p=read(),b=read();
Tree.solve(a,k,p,b);
}
}
return 0;
}