小机房有棵焕狗种的树,树上有N个节点,节点标号为0到N-1,有两只虫子名叫飘狗和大吉狗,分居在两个不同的节点上。有一天,他们想爬到一个节点上去搞基,但是作为两只虫子,他们不想花费太多精力。已知从某个节点爬到其父亲节点要花费 c 的能量(从父亲节点爬到此节点也相同),他们想找出一条花费精力最短的路,以使得搞基的时候精力旺盛,他们找到你要你设计一个程序来找到这条路,要求你告诉他们最少需要花费多少精力
输入描述 Input Description
第一行一个n,接下来n-1行每一行有三个整数u,v, c 。表示节点 u 爬到节点 v 需要花费 c 的精力。
第n+1行有一个整数m表示有m次询问。接下来m行每一行有两个整数 u ,v 表示两只虫子所在的节点
输出描述 Output Description
一共有m行,每一行一个整数,表示对于该次询问所得出的最短距离。
样例输入 Sample Input
3
1 0 1
2 0 1
3
1 0
2 0
1 2
样例输出 Sample Output
1
1
2
数据范围及提示 Data Size & Hint
1<=n<=50000, 1<=m<=75000, 0<=c<=1000
简单lca,注意带权与不带权;;;;
program exam1;
type ab=^node;node=record
a,b:longint;
c:ab;
end;
var n,m,i,j,s,t,k:longint;
p:array[0..60000]of ab;
f,d,g:array[0..60000]of longint;
v:array[0..60000]of boolean;
procedure put(x,y,z:longint);
var ii:ab;
begin
ii:=p[x];
new(p[x]);
p[x]^.a:=y;
p[x]^.b:=z;
p[x]^.c:=ii;
end;
procedure dfs(x:longint);
var i,j:longint;
ii:ab;
begin
v[x]:=true;
ii:=p[x];
while ii<>nil do
begin
if not v[ii^.a] then
begin
f[ii^.a]:=x;
d[ii^.a]:=d[x]+1;
g[ii^.a]:=ii^.b;
dfs(ii^.a);
end;
ii:=ii^.c;
end;
end;
function lca(x,y:longint):longint;
var k:longint;
begin
lca:=0;
if d[x]<d[y] then
begin
k:=x; x:=y; y:=k;
end;
while d[x]>d[y] do
begin
lca:=lca+g[x];
x:=f[x];
end;
while x<>y do
begin
lca:=lca+g[x]; lca:=lca+g[y];
x:=f[x]; y:=f[y];
end;
end;
begin
readln(n);
for i:=1 to n-1 do
begin
readln(s,t,k);
put(s,t,k);
put(t,s,k);
end;
fillchar(v,sizeof(v),0);
fillchar(d,sizeof(d),0);
d[1]:=0;
d[1]:=0;
dfs(1);
readln(k);
for i:=1 to k do
begin
readln(s,t);
writeln(lca(s,t));
end;
end.