#include<bits/stdc++.h>
#define endl '\n'
#define L(a, b, c) for(int a = (b); a <= (c); a++)
#define R(a, b, c) for(int a = (b); a >= (c); a--)
#define ll long long
using namespace std;
template<typename type>
inline type Max(type a, type b){
return (a>b?a:b);
}
template<typename type>
inline type Min(type a, type b){
return (a<b?a:b);
}
#define int ll
const int N = 2e5 + 10, sp = -1;
struct node{
int son, size, top, id;
int dep, fa;
}d[N];
struct segments{
int maxn, lazy, minn, w, l, r;
}sg[N << 2];
int a[N], cnt, n, r[N];
int w1[N], w2[N];
vector<int>e[N];
vector<int>w[N];
#define ls (u << 1)
#define rs (u << 1 | 1)
void pushup(int u){
sg[u].w = sg[ls].w + sg[rs].w;
sg[u].minn = Min(sg[ls].minn, sg[rs].minn);
sg[u].maxn = Max(sg[ls].maxn, sg[rs].maxn);
}
void change(int u){
sg[u].lazy ^= 1;
sg[u].w *= -1;
swap(sg[u].maxn, sg[u].minn);
sg[u].maxn = -sg[u].maxn, sg[u].minn = -sg[u].minn;
}
void pushdown(int u){
if(sg[u].lazy){
change(ls), change(rs);
sg[u].lazy = 0;
}
}
void build(int u, int L, int R){
sg[u].l = L, sg[u].r = R;
if(L == R){
sg[u].maxn = sg[u].minn = sg[u].w = r[L];
return;
}
int mid = L + R >> 1;
build(ls, L, mid);
build(rs, mid + 1, R);
}
int queryadd(int u, int L, int R){
if(L <= sg[u].l && sg[u].r <= R)
return sg[u].w;
int mid = sg[u].l + sg[u].r >> 1;
int sum = 0;
pushdown(u);
if(L <= mid)sum = queryadd(ls, L, R);
if(mid < R)sum += queryadd(rs, L, R);
return sum;
}
int querymax(int u, int L, int R){
if(L <= sg[u].l && sg[u].r <= R)
return sg[u].maxn;
int mid = sg[u].l + sg[u].r >> 1;
int sum = -1e9;
pushdown(u);
if(L <= mid)sum = querymax(ls, L, R);
if(mid < R)sum = Max(querymax(rs, L, R), sum);
return sum;
}
int querymin(int u, int L, int R){
if(L <= sg[u].l && sg[u].r <= R)
return sg[u].minn;
int mid = sg[u].l + sg[u].r >> 1;
pushdown(u);
int sum = 1e9;
if(L <= mid)sum = querymin(ls, L, R);
if(mid < R)sum = Min(querymin(rs, L, R), sum);
return sum;
}
void modify1(int u, int x, int v){
if(sg[u].l == sg[u].r){
sg[u].w = sg[u].maxn = sg[u].minn = v;
return;
}
int mid = sg[u].l + sg[u].r >> 1;
pushdown(u);
if(x <= mid)modify1(ls, x, v);
else modify1(rs, x, v);
pushup(u);
}
void modify2(int u, int L, int R){
if(L <= sg[u].l && sg[u].r <= R){
change(u);
return;
}
int mid = sg[u].l + sg[u].r >> 1;
pushdown(u);
if(L <= mid)modify2(ls, L, R);
if(mid < R)modify2(rs, L, R);
pushup(u);
}
void dfs1(int x, int dep){
d[x].dep = dep;
d[x].size = 1;
int maxsize = -1;
L(i, 1, e[x].size()){
int v = e[x][i - 1];
if(v == d[x].fa)continue;
a[v] = w[x][i - 1];
d[v].fa = x;
dfs1(v, dep + 1);
d[x].size += d[v].size;
if(d[v].size > maxsize)
maxsize = d[v].size, d[x].son = v;
}
}
void dfs2(int x, int top){
d[x].top = top;
d[x].id = ++cnt;
r[cnt] = a[x];
if(!d[x].son)return;
dfs2(d[x].son, top);
L(i, 1, e[x].size()){
int v = e[x][i - 1];
if(v == d[x].fa || v == d[x].son)continue;
dfs2(v, v);
}
}
void modify(int x, int y){
while(d[x].top != d[y].top){
if(d[d[x].top].dep < d[d[y].top].dep)swap(x, y);
modify2(1, d[d[x].top].id, d[x].id);
x = d[d[x].top].fa;
}
if(d[x].dep > d[y].dep)swap(x, y);
if(x != y)modify2(1, d[d[x].son].id, d[y].id);
}
int queryadd(int x, int y){
int ans = 0;
while(d[x].top != d[y].top){
if(d[d[x].top].dep < d[d[y].top].dep)swap(x, y);
ans += queryadd(1, d[d[x].top].id, d[x].id);
x = d[d[x].top].fa;
}
if(d[x].dep > d[y].dep)swap(x, y);
if(x != y) ans += queryadd(1, d[d[x].son].id, d[y].id);
return ans;
}
int querymin(int x, int y){
int ans = 1e9;
while(d[x].top != d[y].top){
if(d[d[x].top].dep < d[d[y].top].dep)swap(x, y);
ans = Min(querymin(1, d[d[x].top].id, d[x].id), ans);
x = d[d[x].top].fa;
}
if(d[x].dep > d[y].dep)swap(x, y);
if(x != y)ans = Min(ans, querymin(1, d[d[x].son].id, d[y].id));
return ans;
}
int querymax(int x, int y){
int ans = -1e9;
while(d[x].top != d[y].top){
if(d[d[x].top].dep < d[d[y].top].dep)swap(x, y);
assert(d[d[x].top].id <= d[x].id);
ans = Max(querymax(1, d[d[x].top].id, d[x].id), ans);
x = d[d[x].top].fa;
}
if(d[x].dep > d[y].dep)swap(x, y);
if(x != y)ans = Max(ans, querymax(1, d[d[x].son].id, d[y].id));
return ans;
}
signed main() {
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
int n;
freopen("P1505_1.in", "r", stdin);
freopen("1.txt", "w", stdout);
cin >> n;
L(i, 2, n){
int u, v, z;
cin >> u >> v >> z;
u++, v++;
w1[i] = u, w2[i] = v;
e[u].push_back(v);
e[v].push_back(u);
w[u].push_back(z);
w[v].push_back(z);
}
dfs1(1, 0);
dfs2(1, 1);
build(1, 1, n);
int m;
cin >> m;
while(m--){
string op;
int l, r;
cin >> op >> l >> r;
l++, r++;
if(op[0] == 'C'){
int z;
if(d[w1[l]].dep > d[w2[l]].dep)z = w1[l];
else z = w2[l];
modify1(1, d[z].id, r - 1);
}
if(op[0] == 'N')modify(l, r);
if(op[0] == 'S')cout << queryadd(l, r) << endl;
if(op[1] == 'A')cout << querymax(l, r) << endl;
if(op[1] == 'I')cout << querymin(l, r) << endl;
}
return 0;
}