# [hdu 2586]lca模板题（在线+离线两种版本）

#include<bits/stdc++.h>
using namespace std;

{
char c=getchar();
while (!isdigit(c)) c=getchar();
int x=0;
while (isdigit(c))
{
x=x*10+c-'0';
c=getchar();
}
return x;
}

const int maxn=40005;
const int maxm=maxn*2;
struct Edge
{
int u,v,w,nxt;
}edge[maxm];
int tot;

void init()
{
tot=0;
}

{
++tot;
edge[tot].u=u;
edge[tot].v=v;
edge[tot].w=w;
}

int dep[maxn];
int pa[maxn];
int dis[maxn];

void dfs(int u,int f,int de,int d)
{
pa[u]=f;
dep[u]=de;
dis[u]=d;
{
int v=edge[i].v;
int w=edge[i].w;
if (v!=f)
{
dfs(v,u,de+1,d+w);
}
}
}

int fa[maxn][20];

int getlca(int u,int v)
{
if (dep[u]<dep[v]) swap(u,v);
int jump=dep[u]-dep[v];
for (int i=0;i<20;i++)
{
if (jump&1) u=fa[u][i];
jump>>=1;
}
for (int i=19;i>=0;i--)
{
if (fa[u][i]!=fa[v][i])
{
u=fa[u][i];
v=fa[v][i];
}
}
if (u!=v) return pa[u];
else return u;
}

int main()
{
int t;
while (t--)
{
init();
int n,q;
for (int i=0;i<n-1;i++)
{
int u,v,w;
}
dfs(1,0,0,0);
for (int i=1;i<=n;i++) fa[i][0]=pa[i];
for (int i=1;i<20;i++)
for (int j=1;j<=n;j++)
fa[j][i]=fa[fa[j][i-1]][i-1];
while (q--)
{
int u,v;
int lca=getlca(u,v);
int ans=dis[u]+dis[v]-2*dis[lca];
printf("%d\n",ans);
}
}
return 0;
}

#include<bits/stdc++.h>
using namespace std;

{
char c=getchar();
while (!isdigit(c)) c=getchar();
int x=0;
while (isdigit(c))
{
x=x*10+c-'0';
c=getchar();
}
return x;
}

const int maxn=40005;
const int maxm=maxn*2;
struct Edge
{
int u,v,w,nxt;
}edge[maxm];
int tot;

void init()
{
tot=0;
}

{
++tot;
edge[tot].u=u;
edge[tot].v=v;
edge[tot].w=w;
}

vector< pair<int,int> > Q[maxn];
bool vis[maxn];
int fa[maxn];
int ans[205];
int dis[maxn];

{
Q[u].push_back(make_pair(v,id));
Q[v].push_back(make_pair(u,id));
}

int findfa(int x)
{
if (fa[x]==x) return x;
return fa[x]=findfa(fa[x]);
}

int n,q;

void dfs(int u,int d)
{
dis[u]=d;
vis[u]=true;
{
int v=edge[i].v;
int w=edge[i].w;
if (!vis[v])
{
dfs(v,d+w);
fa[v]=u;
}
}
for (int i=0;i<Q[u].size();i++)
{
int v=Q[u][i].first;
int id=Q[u][i].second;
if (vis[v]) ans[id]=dis[u]+dis[v]-2*dis[findfa(v)];
}
}

int main()
{
int t;
while (t--)
{
init();
for (int i=0;i<n-1;i++)
{
int u,v,w;
}
for (int i=0;i<maxn;i++) Q[i].clear();
memset(vis,false,sizeof(vis));
for (int i=1;i<=n;i++) fa[i]=i;
for (int i=0;i<q;i++)
{
int u,v;
}