rt /kel
#include<iostream>
#include<cstdio>
using namespace std;
const int aaa=1919810;
const int inf=0x7fffffff;
int n,m,s,l,i,j,v[aaa],first[aaa],nxt[aaa],dep[aaa],fa[aaa],siz[aaa],hson[aaa],tp[aaa],dfn[aaa],nfd[aaa],et,x,y,z,dfscnt,edge_u[aaa],edge_v[aaa];
struct tree
{
int l,r,lazy,mi;
}a[aaa];
void build(int l,int r,int p)
{
a[p].l=l;
a[p].r=r;
a[p].mi=a[p].lazy=inf;
if(l==r)
return ;
int mid=(a[p].l+a[p].r)>>1;
build(l,mid,p<<1);
build(mid+1,r,p<<1|1);
return ;
}
void down(int p)
{
if(a[p].lazy==inf)
return ;
int x=a[p].lazy;
a[p].lazy=0;
a[p<<1].mi=min(a[p<<1].mi,x);
a[p<<1|1].mi=min(a[p<<1|1].mi,x);
a[p<<1].lazy=min(a[p<<1].lazy,x);
a[p<<1|1].lazy=min(a[p<<1|1].lazy,x);
return ;
}
void change(int l,int r,int d,int p)
{
if(l<=a[p].l&&a[p].r<=r)
{
a[p].mi=min(a[p].mi,d);
a[p].lazy=min(a[p].lazy,d);
return ;
}
down(p);
int mid=(a[p].l+a[p].r)>>1;
if(l<=mid)
change(l,r,d,p<<1);
if(mid<r)
change(l,r,d,p<<1|1);
a[p].mi=min(a[p<<1].mi,a[p<<1|1].mi);
return ;
}
int ask(int d,int p)
{
if(a[p].l==a[p].r)
return a[p].mi;
down(p);
int mid=(a[p].l+a[p].r)>>1;
if(d<=mid)
return ask(d,p<<1);
else
return ask(d,p<<1|1);
}
void add(int a,int b)
{
et++;
v[et]=b;
nxt[et]=first[a];
first[a]=et;
return ;
}
int dfs1(int x)
{
siz[x]=1;
hson[x]=-1;
for(int i=first[x];i!=0;i=nxt[i])
{
if(dep[v[i]])
continue;
dep[v[i]]=dep[x]+1;
fa[v[i]]=x;
siz[x]+=dfs1(v[i]);
if(hson[x]==-1||siz[hson[x]]<siz[v[i]])
hson[x]=v[i];
}
return siz[x];
}
void dfs2(int x,int top)
{
tp[x]=top;
dfn[x]=++dfscnt;
nfd[dfscnt]=x;
if(hson[x]==-1)
return ;
dfs2(hson[x],top);
for(i=first[x];i!=0;i=nxt[i])
if(v[i]!=hson[x]&&v[i]!=fa[x])
dfs2(v[i],v[i]);
return ;
}
void change_tree(int x,int y,int z)
{
while(tp[x]!=tp[y])
{
if(dep[tp[x]]<dep[tp[y]])
swap(x,y);
change(dfn[tp[x]],dfn[x],z,1);
x=fa[tp[x]];
}
if(x==y)
return ;
if(dep[x]>dep[y])
swap(x,y);
change(dfn[x]+1,dfn[y],z,1);
return ;
}
int main()
{
scanf("%d%d",&n,&m);
for(i=1;i<n;i++)
{
scanf("%d%d",&edge_u[i],&edge_v[i]);
add(edge_u[i],edge_v[i]);
add(edge_v[i],edge_u[i]);
}
dep[1]=1;
dfs1(1);
dfs2(1,1);
// for(i=1;i<=n;i++)
// cout<<hson[i]<<" "<<tp[i]<<" "<<dfn[i]<<" "<<dep[i]<<endl;
build(1,n,1);
for(;m>=1;m--)
{
scanf("%d%d%d",&x,&y,&z);
change_tree(x,y,z);
}
// for(i=1;i<=n;i++)
// cout<<ask(i,1)<<endl;
for(i=1;i<n;i++)
{
int x;
if(dep[edge_u[i]]>dep[edge_v[i]])
x=ask(dfn[edge_u[i]],1);
else
x=ask(dfn[edge_v[i]],1);
if(x==inf)
x=-1;
printf("%d\n",x);
}
}