#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=40010;
int n,tot,tp,m1,m2,cnt,now;
int to[maxn<<1],next[maxn<<1],head[maxn],p1[maxn],p2[maxn],fa[16][maxn],dep[maxn],ans[maxn],s[maxn],vis[maxn];
struct operation
{
int a1,b1,a2,b2,v;
operation() {}
operation(int _1,int _2,int _3,int _4,int _5) {a1=_1,b1=_2,a2=_3,b2=_4,v=_5;}
}p[maxn<<1];
struct ask
{
int a,b,v,sl,org;
ask() {}
ask(int _1,int _2,int _3,int _4) {a=_1,b=_2,v=_3,org=_4;}
}q[maxn],qq[maxn];
struct node
{
int x,a,b,v;
node() {}
node(int _1,int _2,int _3,int _4) {x=_1,a=_2,b=_3,v=_4;}
}pp[maxn<<1];
inline int rd()
{
int ret=0,f=1; char gc=getchar();
while(gc<‘0‘||gc>‘9‘) {if(gc==‘-‘)f=-f; gc=getchar();}
while(gc>=‘0‘&&gc<=‘9‘) ret=ret*10+gc-‘0‘,gc=getchar();
return ret*f;
}
void add(int a,int b)
{
to[cnt]=b,next[cnt]=head[a],head[a]=cnt++;
}
void dfs(int x)
{
p1[x]=++p1[0];
for(int i=head[x];i!=-1;i=next[i]) if(to[i]!=fa[0][x]) fa[0][to[i]]=x,dep[to[i]]=dep[x]+1,dfs(to[i]);
p2[x]=p1[0];
}
void updata(int x,int v)
{
for(int i=x;i<=n;i+=i&-i)
{
if(vis[i]<now) vis[i]=now,s[i]=0;
s[i]+=v;
}
}
int query(int x)
{
int i,ret=0;
for(i=x;i;i-=i&-i)
{
if(vis[i]<now) vis[i]=now,s[i]=0;
ret+=s[i];
}
return ret;
}
bool cmpx(node a,node b)
{
return a.x<b.x;
}
bool cmpa(ask a,ask b)
{
return a.a<b.a;
}
bool cmpv(operation a,operation b)
{
return a.v<b.v;
}
void solve(int l,int r,int L,int R)
{
if(l==r||L>R)
{
for(int i=L;i<=R;i++) ans[q[i].org]=p[l].v;
return ;
}
sort(p+l,p+r+1,cmpv);
int mid=(l+r)>>1,MID=L-1,i,j;
for(tp=0,now++,i=l;i<=mid;i++)
pp[++tp]=node(p[i].a1,p[i].a2,p[i].b2,1),pp[++tp]=node(p[i].b1+1,p[i].a2,p[i].b2,-1);
sort(pp+1,pp+tp+1,cmpx),sort(q+L,q+R+1,cmpa);
for(i=L,j=1;i<=R;i++)
{
for(;j<=tp&&pp[j].x<=q[i].a;j++) updata(pp[j].a,pp[j].v),updata(pp[j].b+1,-pp[j].v);
q[i].sl=query(q[i].b),MID+=(q[i].sl>=q[i].v);
}
int h1=L,h2=MID+1;
for(i=L;i<=R;i++)
{
if(q[i].sl>=q[i].v) qq[h1++]=q[i];
else q[i].v-=q[i].sl,qq[h2++]=q[i];
}
for(i=L;i<=R;i++) q[i]=qq[i];
solve(l,mid,L,MID),solve(mid+1,r,MID+1,R);
}
int FA(int x,int y)
{
for(int j=15;j>=0;j--) if((1<<j)<=y) y-=(1<<j),x=fa[j][x];
return x;
}
int main()
{
//freopen("bz4009.in","r",stdin);
n=rd(),m1=rd(),m2=rd();
int i,j,a,b,c,d;
memset(head,-1,sizeof(head));
for(i=1;i<n;i++) a=rd(),b=rd(),add(a,b),add(b,a);
dep[1]=1,dfs(1);
for(j=1;(1<<j)<=n;j++) for(i=1;i<=n;i++) fa[j][i]=fa[j-1][fa[j-1][i]];
for(i=1;i<=m1;i++)
{
a=rd(),b=rd(),c=rd();
if(p1[a]>p1[b]) swap(a,b);
if(p2[a]>=p2[b])
{
d=FA(b,dep[b]-dep[a]-1);
p[++tot]=operation(1,p1[d]-1,p1[b],p2[b],c);
if(p2[b]<n) p[++tot]=operation(p1[b],p2[b],p2[d]+1,n,c);
}
else p[++tot]=operation(p1[a],p2[a],p1[b],p2[b],c);
}
for(i=1;i<=m2;i++)
{
a=rd(),b=rd();
if(p1[a]>p1[b]) swap(a,b);
q[i]=ask(p1[a],p1[b],rd(),i);
}
solve(1,tot,1,m2);
for(i=1;i<=m2;i++) printf("%d\n",ans[i]);
return 0;
}//4 4 1 1 2 2 3 1 4 1 2 2 2 3 3 1 4 4 4 1 1 2 4 1