#include<bits/stdc++.h>
#define for1(i,a,b) for( int i=(a);i<=(b);i++)
#define for2(i,a,b) for( int i=(a);i<(b);i++)
#define for3(i,a,b) for( int i=(a);i>=(b);i--)
#define for4(i,a,b) for( int i=(a);i>(b);i--)
#define puba push_back
#define mem(a,b) memset((a),(b),sizeof((a)))
using namespace std;
struct hp{
priority_queue<int>s,t;
void push_down(){
while(!s.empty()&&!t.empty()&&s.top()==t.top()) s.pop(),t.pop();
}
int size(){
return s.size()-t.size();
}
bool empty(){
return s.size()==t.size();
}
void push(int x){
s.push(x);
push_down();
}
void pop(int x){
t.push(x);
push_down();
}
int top(){
if(empty()) return -1e9;
push_down();
return s.top();
}
int get(){
if(size()<2) return -1e9;
int g=s.top();
s.pop();
push_down();
int gg=s.top();
s.push(g);
push_down();
return g+gg;
}
}a[100005],b[100005],ans;
int n;
vector<int>v[100005];
struct tree{
int dfn[100005],st[20][100005],dis[100005],cnt;
int go(int x,int y){
if(dfn[x]<dfn[y]) return x;
return y;
}
int lca(int x,int y){
if(x==y) return x;
if(dfn[x]>dfn[y]) swap(x,y);
x=dfn[x]+1,y=dfn[y];
int l=log2(y-x+1);
return go(st[l][x],st[l][y-(1<<l)+1]);
}
int d(int x,int y){
if(!x||!y) return 0;
int gg=lca(x,y);
return dis[x]+dis[y]-2*dis[gg];
}
void dfs(int u,int from){
cnt++;
dfn[u]=cnt;
st[0][cnt]=from;
for2(i,0,v[u].size()){
int to=v[u][i];
if(to==from) continue;
dis[to]=dis[u]+1;
dfs(to,u);
}
}
void init(){
for1(j,1,18){
for1(i,1,n){
if(i+(1<<j)-1>n) break;
st[j][i]=go(st[j-1][i],st[j-1][i+(1<<(j-1))]);
}
}
}
}tr;
int T,x,y,z,siz[100005],rt,minn=1e9,fa[100005],cnt;
char op;
bool vis[100005];
void getrt(int u,int from,int tot){
siz[u]=1;
int maxx=0;
for2(i,0,v[u].size()){
int to=v[u][i];
if(to==from||vis[to]) continue;
getrt(to,u,tot);
siz[u]+=siz[to];
maxx=max(maxx,siz[to]);
}
maxx=max(maxx,tot-siz[u]);
if(maxx<minn){
minn=maxx;
rt=u;
}
}
void dfs(int u,int from,int x){
a[x].push(tr.d(u,fa[x]));
for2(i,0,v[u].size()){
int to=v[u][i];
if(to==from||vis[to]) continue;
dfs(to,u,x);
}
}
void solve(int u){
if(fa[u]) dfs(u,0,u);
b[u].push(0);
vis[u]=1;
int kk;
for2(i,0,v[u].size()){
int to=v[u][i];
if(vis[to]) continue;
minn=1e9;
getrt(to,0,siz[to]);
kk=rt;
fa[kk]=u;
solve(kk);
if(!a[kk].empty()) b[u].push(a[kk].top());
}
if(b[u].size()>=2) ans.push(b[u].get());
}
void add(int u,int x){
if(!fa[u]) return;
int pre=a[u].top();
a[u].push(tr.d(fa[u],x));
int nxt=a[u].top();
if(pre!=nxt){
int pr=b[fa[u]].get();
if(pre!=-1e9) b[fa[u]].pop(pre);
if(nxt!=-1e9) b[fa[u]].push(nxt);
int nt=b[fa[u]].get();
if(pr!=nt){
if(pr!=-1e9) ans.pop(pr);
if(nt!=-1e9) ans.push(nt);
}
}
add(fa[u],x);
}
void del(int u,int x){
if(!fa[u]) return;
int pre=a[u].top();
a[u].pop(tr.d(fa[u],x));
int nxt=a[u].top();
if(pre!=nxt){
int pr=b[fa[u]].get();
if(pre!=-1e9) b[fa[u]].pop(pre);
if(nxt!=-1e9) b[fa[u]].push(nxt);
int nt=b[fa[u]].get();
if(pr!=nt){
if(pr!=-1e9) ans.pop(pr);
if(nt!=-1e9) ans.push(nt);
}
}
del(fa[u],x);
}
signed main(){
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
cin>>n;
for1(i,1,n-1){
cin>>x>>y;
v[x].puba(y);
v[y].puba(x);
}
tr.dfs(1,0);
tr.init();
getrt(1,0,n);
solve(1);
mem(vis,0);
cnt=n;
cin>>T;
while(T--){
cin>>op;
if(op=='C'){
cin>>x;
if(vis[x]){
add(x,x);
int pre=b[x].get();
b[x].push(0);
int nxt=b[x].get();
if(pre!=nxt){
if(pre!=1e9) ans.pop(pre);
if(nxt!=-1e9) ans.push(nxt);
}
vis[x]=0;
cnt++;
}else{
del(x,x);
int pre=b[x].get();
b[x].pop(0);
int nxt=b[x].get();
if(pre!=nxt){
if(pre!=1e9) ans.pop(pre);
if(nxt!=-1e9) ans.push(nxt);
}
vis[x]=1;
cnt--;
}
}else{
if(!cnt) cout<<"-1\n";
else if(cnt==1) cout<<"0\n";
else cout<<ans.top()<<"\n";
}
}
return 0;
}