#include <bits/stdc++.h>
#define int long long
#define loop(i,l,r,s) for(int i = l;i <= r;i+=s)
#define rloop(i,l,r,s) for(int i = r;i >= l;i-=s)
#define fastio ios_base::sync_with_stdio(false);cout.tie(0);cin.tie(0)
#define fileinp(name) freopen(name".inp","r",stdin)
#define fileout(name) freopen(name".out","w",stdout)
#define all(x) x.begin(),x.end()
#define hv signed main()
#define ins push_back
using namespace std;
const int maxn = 2e5+5;
const int rd = chrono::steady_clock::now().time_since_epoch().count();
template <typename T>
using v = vector<T>;
struct fenwick{
int bit[maxn],n;
fenwick(int N){
n = N;
loop(i,0,n,1)bit[i] = 0;
}
void update(int pos,int val){
while(pos <= n){
bit[pos] += val;
pos += pos&-pos;
}
}
int query(int pos){
int ans = 0;
while(pos > 0){
ans += bit[pos];
pos -= pos&-pos;
}
return ans;
}
int query(int r,int l){
return query(r) - query(l);
}
};
int tin[maxn],tout[maxn],timer = 0,q,n,m;
int jump[21][maxn],depth[maxn];
v<pair<int,int>> a;
v<tuple<int,int,int,int,int>> queries;
v<int> adj[maxn],mid[maxn];
void tour(int u,int p){
tin[u] = ++timer;
jump[0][u] = p;
depth[u] = depth[p]+1;
for(int v : adj[u]){
if(v == p)continue;
tour(v,u);
}
tout[u] = timer;
}
void build(){
for(int i = 1;i < 21;i++)
loop(j,1,n,1)jump[i][j] = jump[i-1][jump[i-1][j]];
}
int lca(int u,int v){
if(depth[u] > depth[v]) swap(u,v);
int dist = depth[v] - depth[u];
for(int i=20;i>=0;i--)
if(dist&(1LL<<i)) v = jump[i][v];
if(u==v) return u;
for(int i=20;i>=0;i--){
if(jump[i][u] != jump[i][v]){
u = jump[i][u];
v = jump[i][v];
}
}
return jump[0][u];
}
int l[maxn],r[maxn],ans[maxn];
void solve(){
loop(i,0,q-1,1)l[i] = 0,r[i] = (int)a.size(),ans[i] = -1;
while(true){
bool stop = true;
loop(i,0,q-1,1){
if(l[i] > r[i])continue;
stop = false;
mid[(l[i]+r[i])/2].ins(i);
}
if(stop)break;
fenwick ctree(n),vtree(n);
loop(i,0,(int)a.size()-1,1){
ctree.update(tin[a[i].second],1);
ctree.update(tout[a[i].second]+1,-1);
}
loop(i,0,(int)a.size(),1){
for(int j : mid[i]){
auto [u,v,gold,bac,p] = queries[j];
int sum = vtree.query(tin[u],tin[p])+vtree.query(tin[v],tin[p]);
int cnt = ctree.query(tin[u],tin[p])+ctree.query(tin[v],tin[p]);
if(sum <= bac){
l[j] = i+1;
ans[j] = cnt;
}else r[j] = i-1;
}
mid[i].clear();
if(i == (int)a.size())continue;
ctree.update(tin[a[i].second],-1);
ctree.update(tout[a[i].second]+1,1);
vtree.update(tin[a[i].second],a[i].first);
vtree.update(tout[a[i].second]+1,-a[i].first);
}
}
loop(i,0,q-1,1){
auto [u,v,gold,bac,p] = queries[i];
cout << max(gold - ans[i],-1LL) << "\n";
}
}
hv{
fastio;
cin >> n >> m >> q;
v<pair<int,int>> edge;
loop(i,2,n,1){
int u,v;
cin >> u >> v;
adj[u].ins(v);
adj[v].ins(u);
edge.emplace_back(u,v);
}
tour(1,0);
build();
loop(i,1,m,1){
int p,c;
cin >> p >> c;
auto [u,v] = edge[p-1];
if(depth[u] < depth[v])swap(u,v);
a.emplace_back(c,u);
}
sort(all(a));
loop(i,1,q,1){
int s,t,v,b;
cin >> s >> t >> v >> b;
queries.emplace_back(s,t,v,b,lca(s,t));
}
solve();
}