#include<bits/stdc++.h>
#define int long long
#define pii pair<int,int>
using namespace std;
const int MAXN=2e5+10;
int x,y,c,n;
struct node{
int to,nxt,d;
}a[MAXN<<1];
int head[MAXN],tot;
int dfn[MAXN],top[MAXN],fa[MAXN],son[MAXN];
int sz[MAXN],dep[MAXN],cnt,lr[MAXN],w[MAXN];
bool is[MAXN];
void add(int x,int y,int w){
a[++tot].to=y;
a[tot].nxt=head[x];
a[tot].d=w;
head[x]=tot;
}
void dfs1(int now,int f){
fa[now]=f;dep[now]=dep[f]+1,sz[now]=1;
int maxn=0;
for(int i=head[now];i;i=a[i].nxt){
int to=a[i].to;
if(to==f) continue;
w[to]=a[i].d;
dfs1(to,now);
sz[now]+=sz[to];
if(sz[to]>maxn) maxn=sz[to],son[now]=to;
}
is[son[now]]=1;
}
void dfs2(int now,int f){
dfn[now]=++cnt,lr[cnt]=now;
if(!is[now]) top[now]=now;
else top[now]=top[f];
if(son[now]) dfs2(son[now],now);
else return ;
for(int i=head[now];i;i=a[i].nxt){
int to=a[i].to;
if((to==f)||(son[now]==to)) continue;
dfs2(to,now);
}
}
struct Node{
int tag,mx,mi,pre;
}t[MAXN<<2];
void push_up(int p){
t[p].mx=max(t[p<<1].mx,t[p<<1|1].mx);
t[p].mi=min(t[p<<1].mi,t[p<<1|1].mi);
t[p].pre=t[p<<1].pre+t[p<<1|1].pre;
}
void build(int p,int l,int r){
if(l==r){
t[p].mi=t[p].mx=t[p].pre=w[lr[l]];return ;
}
int mid=l+r>>1;
build(p<<1,l,mid);
build(p<<1|1,mid+1,r);
push_up(p);
}
void down(int p){
swap(t[p].mi,t[p].mx);
t[p].mx=-t[p].mx;
t[p].mi=-t[p].mi,t[p].pre=-t[p].pre;
t[p].tag^=1;
}
void push_down(int p){
if(t[p].tag){
down(p<<1),down(p<<1|1);
t[p].tag=0;
}
}
void update1(int p,int l,int r,int x,int y){
if(l>=x&&r<=y){
down(p);
return ;
}
push_down(p);
int mid=l+r>>1;
if(mid>=x) update1(p<<1,l,mid,x,y);
else update1(p<<1|1,mid+1,r,x,y);
push_up(p);
}
void modify(int x,int y){
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]]) swap(x,y);
update1(1,1,cnt,dfn[top[x]],dfn[x]);
x=fa[top[x]];
}
if(dep[x]<dep[y]) update1(1,1,cnt,dfn[x],dfn[y]);
else update1(1,1,cnt,dfn[y],dfn[x]);
}
void update2(int p,int l,int r,int x,int w){
if(l==r){
t[p].mi=t[p].pre=t[p].mx=w;return ;
}
push_down(p);
int mid=l+r>>1;
if(mid>=x) update2(p<<1,l,mid,x,w);
else update2(p<<1|1,mid+1,r,x,w);
push_up(p);
}
int query_pre(int p,int l,int r,int x,int y){
if(l>=x&&r<=y) return t[p].pre;
push_down(p);
int mid=l+r>>1;
int ans=0;
if(mid<y) ans+=query_pre(p<<1|1,mid+1,r,x,y);
if(mid>=x) ans+=query_pre(p<<1,l,mid,x,y);
return ans;
}
int ask_pre(int x,int y){
int ans=0;
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]]) swap(x,y);
ans+=query_pre(1,1,cnt,dfn[top[x]],dfn[x]);
x=fa[top[x]];
}
if(dep[x]<dep[y]) ans+=query_pre(1,1,cnt,dfn[x],dfn[y]);
else ans+=query_pre(1,1,cnt,dfn[y],dfn[x]);
return ans;
}
int query_max(int p,int l,int r,int x,int y){
if(l>=x&&r<=y) return t[p].mx;
push_down(p);
int mid=l+r>>1;
int ans=LLONG_MIN;
if(mid<y) ans=max(ans,query_max(p<<1|1,mid+1,r,x,y));
if(mid>=x) ans=max(ans,query_max(p<<1,l,mid,x,y));
return ans;
}
int ask_max(int x,int y){
int ans=LLONG_MIN;
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]]) swap(x,y);
ans=max(ans,query_max(1,1,cnt,dfn[top[x]],dfn[x]));
x=fa[top[x]];
}
if(dep[x]<dep[y]) ans=max(ans,query_max(1,1,cnt,dfn[x]+1,dfn[y]));
else ans=max(ans,query_max(1,1,cnt,dfn[y]+1,dfn[x]));
return ans;
}
int query_min(int p,int l,int r,int x,int y){
if(l>=x&&r<=y){
return t[p].mi;
}
push_down(p);
int mid=l+r>>1;
int ans=LLONG_MAX;
if(mid<y) ans=min(ans,query_min(p<<1|1,mid+1,r,x,y));
if(mid>=x) ans=min(ans,query_min(p<<1,l,mid,x,y));
return ans;
}
int ask_min(int x,int y){
int ans=LLONG_MAX;
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]]) swap(x,y);
ans=min(ans,query_min(1,1,cnt,dfn[top[x]],dfn[x]));
x=fa[top[x]];
}
if(dep[x]<dep[y]) ans=min(ans,query_min(1,1,cnt,dfn[x]+1,dfn[y]));
else ans=min(ans,query_min(1,1,cnt,dfn[y]+1,dfn[x]));
return ans;
}
pii siz[MAXN];
signed main(){
ios::sync_with_stdio(false);
cin.tie(NULL),cout.tie(NULL);
cin>>n;
for(int i=1;i<n;i++){
cin>>x>>y>>c;++x,++y,add(x,y,c),add(y,x,c);
siz[i]=make_pair(x,y);
}
dfs1(1,0),dfs2(1,1);
build(1,1,cnt);
int m;cin>>m;
while(m--){
string op;int x,y;cin>>op>>x>>y;++x,++y;
if(op[0]=='C') --x,--y,update2(1,1,cnt,max(dfn[siz[x].first],dfn[siz[x].second]),y);
else if(op[0]=='N') modify(x,y);
else if(op=="SUM") cout<<ask_pre(x,y)<<'\n';
else if(op=="MIN") cout<<ask_min(x,y)<<'\n';
else cout<<ask_max(x,y)<<'\n';
}
return 0;
}