#include <bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int d[N],dfn[N],sz[N],g[N],f[N],h[N],lg[N<<1],st[N<<1][20],vis[N],light[N],rt,all,en=0,tot=0;
struct edge
{
int to,nxt;
}e[N<<1];
struct node
{
priority_queue<int> x,y;
inline void push(int v)
{
x.push(v);
return;
}
inline void del(int v)
{
y.push(v);
return;
}
inline int size()
{
return x.size()-y.size();
}
inline int fir()
{
while(!y.empty()&&x.top()==y.top())x.pop(),y.pop();
return x.top();
}
inline int sec()
{
int tmp=fir();
x.pop();
int res=fir();
x.push(tmp);
return res;
}
}A,B[N],C[N];
inline int read_d()
{
int x=0;
char ch=getchar();
while(!isdigit(ch))ch=getchar();
while(isdigit(ch))x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
return x;
}
inline char read_c()
{
char ch=getchar();
while(ch!='C'&&ch!='G')ch=getchar();
return ch;
}
void write(int x)
{
if(!x)return;
write(x/10);
putchar(x%10+'0');
return;
}
inline void add(int u,int v)
{
e[++en]=(edge){v,h[u]};
h[u]=en;
return;
}
void dfs(int u,int fa)
{
dfn[u]=++tot;
d[u]=d[fa]+1;
st[tot][0]=d[u];
for(int i=h[u];i;i=e[i].nxt)
{
int v=e[i].to;
if(v==fa)continue;
dfs(v,u);
st[++tot][0]=d[u];
}
return;
}
inline void init()
{
for(int i=2;i<=tot;i++)lg[i]=lg[i>>1]+1;
for(int j=1;j<=lg[tot];j++)for(int i=1;i+(1<<j)-1<=tot;i++)st[i][j]=min(st[i][j-1],st[i+(1<<(j-1))][j-1]);
return;
}
void get_rt(int u,int fa)
{
sz[u]=1,g[u]=0;
for(int i=h[u];i;i=e[i].nxt)
{
int v=e[i].to;
if(v==fa||vis[v])continue;
get_rt(v,u);
sz[u]+=sz[v];
g[u]=max(g[u],sz[v]);
}
g[u]=max(g[u],all-sz[u]);
if(!rt||g[u]<g[rt])rt=u;
return;
}
inline int d_lca(int u,int v)
{
int x=dfn[u],y=dfn[v];
if(x>y)swap(x,y);
int k=lg[y-x+1];
return min(st[x][k],st[y-(1<<k)+1][k]);
}
inline int dis(int u,int v)
{
return d[u]+d[v]-2*d_lca(u,v);
}
void calc(int u,int fa)
{
C[rt].push(dis(u,f[rt]));
sz[u]=1;
for(int i=h[u];i;i=e[i].nxt)
{
int v=e[i].to;
if(v==fa||vis[v])continue;
calc(v,u);
sz[u]+=sz[v];
}
return;
}
inline void pushA(int u)
{
if(B[u].size()>=2)A.push(B[u].fir()+B[u].sec());
return;
}
inline void delA(int u)
{
if(B[u].size()>=2)A.del(B[u].fir()+B[u].sec());
return;
}
void build(int u)
{
vis[u]=true;
B[u].push(0);
calc(u,0);
for(int i=h[u];i;i=e[i].nxt)
{
int v=e[i].to;
if(vis[v])continue;
rt=0,all=sz[v];
get_rt(v,0);
v=rt;
f[v]=u;
build(v);
B[u].push(C[v].fir());
}
pushA(u);
return;
}
inline void ON(int x)
{
delA(x);
B[x].del(0);
pushA(x);
for(int i=x;f[i];i=f[i])
{
delA(f[i]);
B[f[i]].del(C[i].fir());
C[i].del(dis(x,f[i]));
if(C[i].size())B[f[i]].push(C[i].fir());
pushA(f[i]);
}
return;
}
inline void OFF(int x)
{
delA(x);
B[x].push(0);
pushA(x);
for(int i=x;f[i];i=f[i])
{
delA(f[i]);
if(C[i].size())B[f[i]].del(C[i].fir());
C[i].push(dis(x,f[i]));
B[f[i]].push(C[i].fir());
pushA(f[i]);
}
return;
}
int main()
{
int n=read_d();
int off=n;
for(int i=1;i<n;i++)
{
int u,v;
u=read_d(),v=read_d();
add(u,v);
add(v,u);
}
dfs(1,0);
init();
rt=0,all=n;
get_rt(1,0);
build(rt);
int q=read_d();
while(q--)
{
char op=read_c();
if(op=='C')
{
int x=read_d();
if(light[x])OFF(x),off++;
else ON(x),off--;
light[x]^=1;
}
else
{
if(off==0)puts("-1");
else if(off==1)puts("0");
else write(A.fir()),putchar('\n');
}
}
return 0;
}