// 最终模板
#include <bits/stdc++.h>
using namespace std;
const int N=5e5+5,M=5e5+5;
int n,m,s,u,v,a,b;
int d[N],p[N][31];
int cnt,head[N];
struct edge{int next,to;}e[M<<1];
inline void add(int u,int v)
{
cnt++;
e[cnt].next=head[u];
e[cnt].to=v;
head[u]=cnt;
}
inline void dfs(int u,int fa)
{
// p[i][j]表示i节点向上2^j层后到达的节点
for (register int i=1; (1<<i)<=d[u]; ++i) p[u][i]=p[p[u][i-1]][i-1];
for (register int i=head[u]; i; i=e[i].next)
if (e[i].to!=fa)
{
d[e[i].to]=d[u]+1;
p[e[i].to][0]=u;
dfs(e[i].to,u);
}
}
inline int lca(int a,int b)
{
if (d[a]>d[b]) swap(a,b); //强制让b节点向上移动
for (register int i=20; i>=0; --i) if (d[b]-(1<<i)>=d[a]) b=p[b][i];
// 如果,位于下面的b节点,向上移动(1<<i)的层数,还是>=a的层数的话,就把b节点向上移动
if (a==b) return a;
for (register int i=20; i>=0; --i)
if (p[a][i]==p[b][i]) continue; //如果这次的这个祖先一样,就找下一个祖先,写个continue,更有层次感
else a=p[a][i],b=p[b][i]; //如果这次的祖先不一样,那么就把这两个点都向上移动
return p[a][0];
}
int main(){
scanf("%d%d%d",&n,&m,&s);
for (register int i=1; i<n; ++i) scanf("%d%d",&u,&v),add(u,v),add(v,u);
dfs(s,0);
for (register int i=1; i<=m; ++i)
{
scanf("%d%d",&a,&b);
printf("%d\n",lca(a,b));
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
const int N=5e4+5;
int n,m,u,v,w,x,y,LCA,ans;
int d[N],p[N][21],f[N],ff[N];
int cnt,head[N];
struct edge{int next,to,w;}e[N<<1];
inline void add(int u,int v,int w)
{
cnt++;
e[cnt].next=head[u];
e[cnt].to=v;
e[cnt].w=w;
head[u]=cnt;
}
void dfs(int u,int fa,int w)
{
ff[u]=w;
for (register int i=1; (1<<i)<=d[u]; ++i) p[u][i]=p[p[u][i-1]][i-1];
for (register int i=head[u]; i; i=e[i].next)
if (e[i].to!=fa)
{
d[e[i].to]=d[u]+1;
p[e[i].to][0]=u;
dfs(e[i].to,u,e[i].w);
}
}
inline int lca(int a,int b)
{
if (d[a]>d[b]) swap(a,b);
for (register int i=20; i>=0; --i) if (d[b]-(1<<i)>=d[a]) b=p[b][i];
if (a==b) return a;
for (register int i=20; i>=0; --i)
if (p[a][i]==p[b][i]) continue;
else a=p[a][i],b=p[b][i];
return p[a][0];
}
void dfs1(int u,int fa)
{
for (register int i=head[u]; i; i=e[i].next)
if (e[i].to!=fa)
{
dfs1(e[i].to,u);
f[u]+=f[e[i].to];
}
ans=max(ans,f[u]);
}
int main(){
//f[i]表示i节点的父亲到i节点的距离
scanf("%d",&n);
for (register int i=1; i<n; ++i) scanf("%d%d%d",&u,&v,&w),add(u,v,w),add(v,u,w);
dfs(1,0,0);
scanf("%d",&m);
for (register int i=1; i<=m; ++i)
{
scanf("%d%d",&x,&y);
LCA=lca(x,y);
f[x]++; f[y]++; f[LCA]-=2;
}
dfs1(1,0);
for (register int i=1; i<=n; ++i) f[i]+=ff[i];
for (register int i=1; i<=n; ++i) printf("%d ",f[i]); puts("");
return 0;
}