#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define maxn 100005
#define file

int n, m, q;
vector<int> g[maxn];

struct edge {
    int u, v;
} edges[maxn];

struct station {
    int id, cost;
} stations[maxn];

vector<pair<int, int> > ups[maxn];

int par[20][maxn], deep[maxn];
void pre_dfs (int u, int p) {
    for (int v : g[u]) {
        if (v == p) continue ;
        deep[v] = deep[u] + 1;
        par[0][v] = u;
        for (int i = 1; i < 20; i++) par[i][v] = par[i - 1][par[i - 1][v]];

        pre_dfs (v, u);
    }
}
int LCA (int u, int v) {
    if (deep[u] < deep[v]) swap (u, v);
    int dif = deep[u] - deep[v];

    for (int i = 19; i >= 0; i--) if ((dif >> i) & 1) {
        u = par[i][u];
    }

    if (u == v) return u;

    for (int i = 19; i >= 0; i--) if (par[i][u] != par[i][v]) {
        u = par[i][u];
        v = par[i][v];
    }

    return par[0][u];
}

int root[maxn], id_node;
struct node {
    ll val, cnt;
    int le, ri;
} tr[maxn * 20];

int update (int id, int l, int r, int pos, int val) {
    int ne_id = ++id_node;
    tr[ne_id] = tr[id];

    tr[ne_id].val += val;
    tr[ne_id].cnt += 1;

    if (l == r) return ne_id;

    int mid = (l + r) >> 1;
    if (pos <= mid) tr[ne_id].le = update (tr[id].le, l, mid, pos, val);
    else tr[ne_id].ri = update (tr[id].ri, mid + 1, r, pos, val);

    return ne_id;
}

int get_cnt (int u, int v, int lca, int l, int r, ll val) {
    if (l == r) {
        int cnt = tr[u].cnt + tr[v].cnt - 2 * tr[lca].cnt;
        ll cur_val = tr[u].val + tr[v].val - 2ll * tr[lca].val;

        if (cur_val <= val) return cnt;
        else return 0;
    }

    int mid = (l + r) >> 1;
    int cnt_le = tr[tr[u].le].cnt + tr[tr[v].le].cnt - 2 * tr[tr[lca].le].cnt;
    ll val_le = tr[tr[u].le].val + tr[tr[v].le].val - 2ll * tr[tr[lca].le].val;

    if (val_le > val) return get_cnt (tr[u].le, tr[v].le, tr[lca].le, l, mid, val);
    else return get_cnt (tr[u].ri, tr[v].ri, tr[lca].ri, mid + 1, r, val - val_le) + cnt_le;
}

void dfs (int u, int p) {
    root[u] = root[p];
    for (auto x : ups[u]) {
        root[u] = update (root[u], 1, m, x.first, x.second);
    }

    for (int v : g[u]) {
        if (v == p) continue ;
        dfs (v, u);
    }
}

void read() {
    cin >> n >> m >> q;
    for (int i = 1; i < n; i++) {
        int u, v;
        cin >> u >> v;
        edges[i] = {u, v};
        g[u].push_back (v);
        g[v].push_back (u);
    }

    for (int i = 1; i <= m; i++) {
        int id, cost;
        cin >> id >> cost;
        stations[i] = {id, cost};
    }
}

void solve() {
    pre_dfs (1, -1);

    sort (stations + 1, stations + m + 1, [](const station& a, const station& b) {
        return a.cost < b.cost;
    });

    for (int i = 1; i <= m; i++) {
        int id_e = stations[i].id, cost = stations[i].cost;

        int u = edges[id_e].u, v = edges[id_e].v;
        if (par[0][u] == v) swap (u, v);

        ups[v].push_back ({i, cost});
    }

    dfs (1, 0);

    while (q--) {
        ll u, v, x, y;
        cin >> u >> v >> x >> y;

        int lca = LCA (u, v);

        int tol_cnt = tr[root[u]].cnt + tr[root[v]].cnt - 2 * tr[root[lca]].cnt;
        int cur_cnt = get_cnt (root[u], root[v], root[lca], 1, m, y);
        int gold_needed = tol_cnt - cur_cnt;

        if (x < gold_needed) cout << "-1\n";
        else cout << x - gold_needed << '\n';
    }
}

signed main() {
    ios_base::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);

    if (fopen(file".INP","r")) {
        freopen(file".INP","r",stdin);
        freopen(file".OUT","w",stdout);
    }

    read();
    solve();

    return 0;
}
