const int inf=0x3f3f3f3f; const int maxn=1000000+5; int n,q,K; int dfn[maxn],sign; ll ans1; int ans2,ans3; int key[maxn],isk[maxn]; int f[maxn],g[maxn];
struct edge { int u,v,w,nxt; }e[maxn];
int prt[maxn][25],dep[maxn]; int head[maxn],ecnt; void eADD(int u,int v,int w) { e[++ecnt].u=u; e[ecnt].v=v; e[ecnt].w=w; e[ecnt].nxt=head[u]; head[u]=ecnt; }
void Pre(int u,int fa) { dep[u]=dep[fa]+1; dfn[u]=++sign; prt[u][0]=fa; for(register int i=1;(1<<i)<=dep[u];++i) prt[u][i]=prt[prt[u][i-1]][i-1]; for(register int i=head[u];i;i=e[i].nxt) { int v=e[i].v; if(v==fa)continue; Pre(v,u); } }
int LCA(int x,int y) { if(dep[x]<dep[y])swap(x,y); for(register int i=20;i>=0;--i) if(dep[prt[x][i]]>=dep[y]) x=prt[x][i]; if(x==y)return x; for(register int i=20;i>=0;--i) if(prt[x][i]!=prt[y][i]) x=prt[x][i],y=prt[y][i]; return prt[x][0]; }
int siz[maxn]; void clear() { for(register int i=1;i<=ecnt;++i) { head[e[i].u]=siz[e[i].u]=f[e[i].u]=g[e[i].u]=0; head[e[i].v]=siz[e[i].v]=f[e[i].v]=g[e[i].u]=0; e[i].u=e[i].v=e[i].w=e[i].nxt=0; } ecnt=0; }