1 #include<bits/stdc++.h>
2 using namespace std;
3 const int N=1e6+5,inf=0x3f3f3f3f;
4 long long next[2*N],head[2*N],to[N*2],d[N],f[N][21],xu[N],id[N],v[2*N],in[N],di[N];
5 int n;
6 int m,q,w,p,tot,cnt;
7 long long ans;
8 set<int>Set;
9 int read()
10 {
11 int f=1;char ch;
12 while((ch=getchar())<'0'||ch>'9')
13 if(ch=='-')f=-1;
14 int res=ch-'0';
15 while((ch=getchar())>='0'&&ch<='9')
16 res=res*10+ch-'0';
17 return res*f;
18 }
19 void write(int x)
20 {
21 if(x<0)
22 {
23 putchar('-');
24 x=-x;
25 }
26 if(x>9)write(x/10);
27 putchar(x%10+'0');
28 }
29 void ADD(int x,int y,int z)
30 {
31 next[++tot]=head[x];
32 head[x]=tot;
33 to[tot]=y;v[tot]=z;
34 }
35 int lca(int x,int y)
36 {
37 if(d[x]<d[y])swap(x,y);
38 for(int i=20;i>=0;i--)
39 {
40 if(d[f[x][i]]>=d[y])x=f[x][i];
41 if(x==y)return x;
42 }
43 for(int i=20;i>=0;i--)
44 {
45 if(f[x][i]!=f[y][i])
46 {
47 x=f[x][i];
48 y=f[y][i];
49 }
50 }
51 return f[x][0];
52 }
53 long long dis(int x,int y)
54 {
55 return di[x]+di[y]-di[lca(x,y)]*2;
56 }
57 inline void dfs(int x,int fa)
58 {
59 id[++cnt]=x; xu[x]=cnt;
60 f[x][0]=fa; d[x]=d[fa]+1;
61 int i;
62 for(i=head[x];i;i=next[i]) if(to[i]!=fa)
63 {
64 di[to[i]]=di[x]+v[i];
65 dfs(to[i],x);
66 }
67 return;
68 }
69 inline void Pre()
70 {
71 int i,j;
72 dfs(1,0);
73 for(i=1;i<=19;i++)
74 {
75 for(j=1;j<=n;j++) f[j][i]=f[f[j][i-1]][i-1];
76 }
77 Set.insert(-inf); Set.insert(inf);
78 return;
79 }
80 void ad(int x)
81 {
82 if(in[xu[x]])return ;
83 Set.insert(xu[x]);in[xu[x]]=1;
84 set<int>::iterator it=Set.upper_bound(xu[x]);
85 int p2=(*it),p1=(*(--(--it)));
86 if(p1!=-inf) ans+=dis(id[p1],x);
87 if(p2!=inf)ans+=dis(x,id[p2]);
88 if(p1!=-inf&&p2!=inf)ans-=dis(id[p1],id[p2]);
89 //cout<<ans<<endl;注释掉的部分是调试的时候加上去的,不用理啦(*・ω-q)
90 }
91 void de(int x)
92 {
93 if(!in[xu[x]])return ;Set.erase(xu[x]);in[xu[x]]=0;
94 set<int>::iterator it=Set.upper_bound(xu[x]);
95 int p2=(*it),p1=(*(--it));//这个地方千万不要写反哟,区别hin大的(才不会告诉你我自己都写错了呢)
96 if(p1!=-inf) ans-=dis(id[p1],x);
97 if(p2!=inf)ans-=dis(x,id[p2]);
98 if((p1!=-inf)&&(p2!=inf))ans+=dis(id[p1],id[p2]);
99 //cout<<ans<<endl;
100 }
101 long long an()
102 {
103 long long dd=(Set.size()>3)?(dis(id[*(Set.upper_bound(-inf))],id[*(--Set.lower_bound(inf))])):0;
104 //cout<<dd<<endl;上面的三目运算符应该看得懂吧,毕竟小可爱们都辣么聪明,拆成几个部分就比较好理解惹
105 return (ans+dd)>>1;//对首尾的特殊处理
106 }
107 int main()
108 {
109 n=read();
110 for(int i=1;i<n;i++)
111 {
112 int x,y,z;
113 x=read();y=read();z=read();
114 ADD(x,y,z);
115 ADD(y,x,z);
116 }
117 Pre();
118 //Set.insert(-inf); Set.insert(inf);
119 q=read();
120 while(q--)
121 {
122 char ch[5];int x;
123 scanf("%s",ch+1);//最好是这样写哦,不然很容易错鸭
124 switch(ch[1])
125 {
126 case '+':{
127 x=read();
128 ad(x);
129 break;
130 }
131 case '-':{
132 x=read();
133 de(x);
134 break;
135 }
136 case '?':{
137 printf("%lld",an());
138 putchar('\n');
139 break;
140 }
141
142 }
143 }
144 return 0;
145 }