#include <cstdio>
#include <cstring>
#include <iostream>
#include <queue>
using namespace std;
const int maxn=100010;
int n,m,mn,rt,tot,cnt,sum;
int to[maxn<<1],next[maxn<<1],head[maxn],fa[maxn],dep[maxn],pos[maxn];
int md[18][maxn<<1],Log[maxn<<1],siz[maxn],q[maxn];
bool light[maxn],vis[maxn];
struct heap
{
priority_queue<int> A,B;
void push(int x) {A.push(x);}
void erase(int x) {B.push(x);}
void pop()
{
while(B.size()&&A.top()==B.top()) A.pop(),B.pop();
A.pop();
}
int top()
{
while(B.size()&&A.top()==B.top()) A.pop(),B.pop();
return !A.size()?0:A.top();
}
int top2()
{
if(size()<2) return 0;
int x=top(); pop();
int y=top(); push(x);
return y;
}
int size() {return A.size()-B.size();}
}p1[maxn],p2[maxn],p;
char str[10];
inline int rd()
{
int ret=0,f=1; char gc=getchar();
while(gc<‘0‘||gc>‘9‘) {if(gc==‘-‘)f=-f; gc=getchar();}
while(gc>=‘0‘&&gc<=‘9‘) ret=ret*10+gc-‘0‘,gc=getchar();
return ret*f;
}
int lca(int a,int b)
{
a=pos[a],b=pos[b];
if(a>b) swap(a,b);
int k=Log[b-a+1];
return min(md[k][a],md[k][b-(1<<k)+1]);
}
int dis(int a,int b)
{
return dep[a]+dep[b]-2*lca(a,b);
}
void add(int a,int b)
{
to[cnt]=b,next[cnt]=head[a],head[a]=cnt++;
}
void getr(int x,int fa)
{
siz[x]=1;
int tmp=0,i;
for(i=head[x];i!=-1;i=next[i]) if(to[i]!=fa&&!vis[to[i]])
getr(to[i],x),siz[x]+=siz[to[i]],tmp=max(tmp,siz[to[i]]);
tmp=max(tmp,tot-siz[x]);
if(tmp<mn) mn=tmp,rt=x;
}
void solve(int x)
{
vis[x]=1,q[++q[0]]=x;
for(int i=head[x];i!=-1;i=next[i]) if(!vis[to[i]]) tot=siz[to[i]],mn=1<<30,getr(to[i],x),fa[rt]=x,solve(rt);
}
void dfs(int x)
{
md[0][++pos[0]]=dep[x],pos[x]=pos[0];
for(int i=head[x];i!=-1;i=next[i]) if(!dep[to[i]]) dep[to[i]]=dep[x]+1,dfs(to[i]),md[0][++pos[0]]=dep[x];
}
void turnoff(int x,int y)
{
if(x==y)
{
p2[x].push(0);
if(p2[x].size()==2) p.push(p2[x].top());
}
if(!fa[x]) return ;
int f=fa[x],d=dis(f,y),tp=p1[x].top();
p1[x].push(d);
if(d>tp)
{
int mx=p2[f].top()+p2[f].top2(),sz=p2[f].size();
if(tp) p2[f].erase(tp);
p2[f].push(d);
int nx=p2[f].top()+p2[f].top2();
if(nx>mx)
{
if(sz>=2) p.erase(mx);
if(p2[f].size()>=2) p.push(nx);
}
}
turnoff(f,y);
}
void turnon(int x,int y)
{
if(x==y)
{
if(p2[x].size()==2) p.erase(p2[x].top());
p2[x].erase(0);
}
if(!fa[x]) return ;
int f=fa[x],d=dis(f,y);
p1[x].erase(d);
int tp=p1[x].top();
if(d>tp)
{
int mx=p2[f].top()+p2[f].top2(),sz=p2[f].size();
p2[f].erase(d);
if(tp) p2[f].push(tp);
int nx=p2[f].top()+p2[f].top2();
if(nx<mx)
{
if(sz>=2) p.erase(mx);
if(p2[f].size()>=2) p.push(nx);
}
}
turnon(f,y);
}
int main()
{
n=rd();
int i,j,a,b;
memset(head,-1,sizeof(head));
for(i=1;i<n;i++) a=rd(),b=rd(),add(a,b),add(b,a);
dep[1]=1,dfs(1);
for(i=2;i<=2*n-1;i++) Log[i]=Log[i>>1]+1;
for(j=1;(1<<j)<=2*n-1;j++)
for(i=1;i+(1<<j)-1<=2*n-1;i++)
md[j][i]=min(md[j-1][i],md[j-1][i+(1<<(j-1))]);
tot=n,mn=1<<30,getr(1,0),solve(rt);
for(i=1;i<=n;i++) turnoff(i,i);
m=rd(),sum=n;
for(i=1;i<=m;i++)
{
scanf("%s",str);
if(str[0]==‘G‘)
{
if(sum>=2) printf("%d\n",p.top());
else if(sum==1) printf("0\n");
else printf("-1\n");
}
else
{
a=rd();
if(light[a]) sum++,light[a]=0,turnoff(a,a);
else sum--,light[a]=1,turnon(a,a);
}
}
return 0;
}//8 1 2 2 3 3 4 3 5 3 6 6 7 6 8 7 G C 1 G C 2 G C 1 G