#include<bits/stdc++.h>
using namespace std;
#define N 100005
#define pb push_back
#define S son[now].size()
#define chk ((!vst[T=son[now][i]])&&(T!=fat))
vector<int>son[N],to[N];
#define getc() p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;
char buf[1<<21],*p1,*p2,cha;
int ret;
inline int re() {
ret=0;
cha=getc();
while(!isdigit(cha)){
cha=getc();
}
while(isdigit(cha)){
ret=(ret<<1)+(ret<<3)+(cha^48);
cha=getc();
}
return ret;
}
inline char rech(){
cha=getc();
while(cha<'A'||cha>'Z')cha=getc();
return cha;
}
typedef struct dui{
priority_queue<int>p,d;int size;
int get1(){
while(d.size()&&p.top()==d.top())p.pop(),d.pop();
return p.top();
}int ins(int x){p.push(x);++size;}
int rem(int x){if(p.top()==x)p.pop();else d.push(x);--size;}
int ans(){
int f1=get1(),f2;p.pop();f2=get1();
p.push(f1);return f1+f2;
}
int CH1(){return size>1;}
int CH0(){return size;}
}dui;
dui qj,f[N],ch[N];
int DD_max,fa[N][20],is[N],frm[N][20],dep[N],vst[N],Son[N],size[N],SIZ,root,FA[N],top[N];
char opt;
void cp_dfs(int now,int fat){
dep[now]=dep[fat]+1;size[now]=1;FA[now]=fat;
for(int T,i=0;i<S;++i)if((T=son[now][i])!=fat)
cp_dfs(T,now),size[now]+=size[T],(size[T]>size[Son[now]])&&(Son[now]=T);
}
void cp_dfs0(int now,int tp){
top[now]=tp;if(Son[now])cp_dfs0(Son[now],tp);
for(int T,i=0;i<S;++i)if((T=son[now][i])!=FA[now]&&T!=Son[now])cp_dfs0(T,T);
}
void pre(int now,int fat){
size[now]=1;
for(int T,i=0;i<S;++i)
if(chk)pre(T,now),size[now]+=size[T];
}
void rt(int now,int fat){
int i=0,T,mx=SIZ-size[now];
for(;i<S;++i)
if(chk)rt(T,now),mx=max(mx,size[T]);
if(mx<=(SIZ>>1))root=now;
}
void dfs0(int FAT,int DD,int rt,int now,int fat,int dep){
ch[rt].ins(dep),++dep;frm[now][DD]=rt;fa[now][DD]=FAT;
for(int T,i=0;i<son[now].size();++i)
if(chk)dfs0(FAT,DD,rt,T,now,dep);
}
int dis(int x,int y){
int ans=dep[x]+dep[y];
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]])swap(x,y);
x=FA[top[x]];
}
if(dep[x]>dep[y])return ans-2*dep[y];
return ans-dep[x]*2;
}
void dfs(int DD,int now){
rt(now,0);now=root;vst[now]=1;
pre(now,0);
for(int T,i=0;i<son[now].size();++i)
if(!vst[T=son[now][i]])
dfs0(now,DD,T,T,0,1),f[now].ins(ch[T].get1()),SIZ=size[T],dfs(DD+1,T);
f[now].ins(0);if(f[now].CH1())qj.ins(f[now].ans());
}int n,i,x,y,m,X,gb,y_;
int main(){
for(n=re(),i=1;i<n;++i)x=re(),y=re(),son[x].pb(y),son[y].pb(x);
SIZ=n;pre(1,0);dfs(0,1);cp_dfs(1,0);cp_dfs0(1,1);
m=re();gb=n;while(m--){
if(rech()=='C'){
x=re();X=0;
if(!is[x]){
--gb;is[x]=1;
if(f[x].CH1())qj.rem(f[x].ans());
f[x].rem(0);
if(f[x].CH1())qj.ins(f[x].ans());
for(;fa[x][X];++X){
y=fa[x][X];y_=frm[x][X];
if(f[y].CH1())qj.rem(f[y].ans());
if(ch[y_].CH0())f[y].rem(ch[y_].get1());
ch[y_].rem(dis(x,y_)+1);
if(ch[y_].CH0())f[y].ins(ch[y_].get1());
if(f[y].CH1())qj.ins(f[y].ans());
}
}
else{
++gb;is[x]=0;
if(f[x].CH1())qj.rem(f[x].ans());
f[x].ins(0);
if(f[x].CH1())qj.ins(f[x].ans());
for(;fa[x][X];++X){
y=fa[x][X];y_=frm[x][X];
if(f[y].CH1())qj.rem(f[y].ans());
if(ch[y_].CH0())f[y].rem(ch[y_].get1());
ch[y_].ins(dis(x,y_)+1);
if(ch[y_].CH0())f[y].ins(ch[y_].get1());
if(f[y].CH1())qj.ins(f[y].ans());
}
}
}
else{
if(!gb)puts("-1");
else if(gb==1)puts("0");
else printf("%d\n",qj.get1());
}
}
}