#include<bits/stdc++.h>
using namespace std;
#define ll long long

struct P
{
    int x,y,z;
};

int a,b,c,sg[333333];
int dx[10]={1,0,-1,0},dy[11]={0,1,0,-1};
ll x,y,z;
const ll mod=1000000007;
int fl[333333],ans[111111];
vector<int> tr[101111],v[101111];
vector<P> s[101111],q[101111];
int hld[101111],chn[101111],w[101111],pr[111111],nn,l[111111];

void init(int n,int p)
{
    pr[n]=p;
    w[n]=1;
    l[n]=l[p]+1;
    for(int h:v[n])
        if(h!=p)
    {
        init(h,n);
        tr[n].push_back(h);
       // printf("%d %d\n",n,h);
        w[n]+=w[h];
    }
    for(int h=0;h<tr[n].size();h++)
        if(w[tr[n][0]]<w[tr[n][h]]) swap(tr[n][0],tr[n][h]);
}

void mk_hld(int n,int c)
{
    nn++;
    hld[n]=nn;
    chn[n]=c;
    if(tr[n].size()) mk_hld(tr[n][0],c);
    for(int h=1;h<tr[n].size();h++)
        mk_hld(tr[n][h],tr[n][h]);
}

void up(int i,int n,int m)
{
    if(n==m||!fl[i]) return;
    if(sg[i*2]<sg[i]) fl[i*2]=1,sg[i*2]=max(sg[i],sg[i*2]);
    if(sg[i*2+1]<sg[i]) fl[i*2+1]=1,sg[i*2+1]=max(sg[i],sg[i*2+1]);
    fl[i]=0;
}

void go(int i,int n,int m,int c,int d,int k)
{
    if(m<c||n>d) return;
    //printf("+++%d %d %d\n",c,d,k);
    up(i,n,m);
    if(c<=n&&m<=d)
    {
        if(k>sg[i]) fl[i]=1;
        sg[i]=max(sg[i],k);
        //printf("%d %d %d\n",n,m,sg[i]);
        return;
    }
    go(i*2,n,(n+m)/2,c,d,k);
    go(i*2+1,(n+m)/2+1,m,c,d,k);
    sg[i]=max(max(sg[i*2],sg[i*2+1]),sg[i]);
}

int get(int i,int n,int m,int c,int d)
{
    if(m<c||n>d) return 0;
    up(i,n,m);
    if(c<=n&&m<=d)
    {
        //printf("#%d\n",sg[i]);
        return sg[i];
    }
    return max(get(i*2,n,(n+m)/2,c,d),get(i*2+1,(n+m)/2+1,m,c,d));
}

int lcp(int n,int m)
{
    for(;chn[n]!=chn[m];)
    {
        if(hld[n]>hld[m]) n=pr[chn[n]];
        else m=pr[chn[m]];
    }
    if(l[n]>l[m]) return m;
    return n;
}

void f(int n,int m,int c)
{
    if(l[n]<=l[m]) return;
    if(chn[n]==chn[m])
    {

        go(1,1,100000,hld[m]+1,hld[n],c);
        return;
    }

    go(1,1,100000,hld[chn[n]],hld[n],c);
    f(pr[chn[n]],m,c);
}

int g(int n,int m)
{
    if(l[n]<=l[m]) return 0;
    //printf("**%d %d %d\n",hld[n],hld[m],chn[n]);
    if(chn[n]==chn[m])
    {
        //printf("#%d %d %d %d\n",n,m,hld[n],hld[m]);
        return get(1,1,100000,hld[m]+1,hld[n]);
    }
    //printf("&&%d\n",get(1,1,100000,hld[chn[n]],hld[n]));
    return max(get(1,1,100000,hld[chn[n]],hld[n]),g(pr[chn[n]],m));
}

int main()
{
    scanf("%d %d %d",&a,&b,&c);
    //printf("%d@%d@%d",a,b,c);
    for(int t=1;t<a;t++)
    {
        int n,m;
        scanf("%d %d",&n,&m);
        v[n].push_back(m);
        v[m].push_back(n);
    }
    init(1,0);
    mk_hld(1,0);
    for(int t=1;t<=b;t++)
    {
        int n,m,ss,e;
        scanf("%d %d %d %d",&ss,&e,&n,&m);
        s[ss].push_back({n,m,e});
    }
    for(int t=1;t<=c;t++)
    {
        int n,m,k;
        scanf("%d %d %d",&k,&n,&m);
        q[k].push_back({n,m,t});
    }
    for(int t=1;t<=100000;t++)
    {
        for(P h:s[t])
        {
            int p=lcp(h.x,h.y);
            //printf("%d %d %d %d\n",h.x,h.y,p,h.z);
            f(h.x,p,h.z);
            f(h.y,p,h.z);
        }
        for(P h:q[t])
        {
            int p=lcp(h.x,h.y);
            //printf("!!!!!!!!!!!!!!!!!%d %d\n",h.z,p);
           // printf("%d %d\n",h.z,max(g(h.x,p),g(h.y,p)));
            if(max(g(h.x,p),g(h.y,p))<t) ans[h.z]=1;
        }
    }
    for(int t=3;t<=8;t++)
    {
        if(!ans[t]) goto asd;
    }
    ans[9]=1;
    //printf("%d#%d#%d",a,b,c);
    asd:;
    for(int t=1;t<=c;t++)
        if(ans[t]) puts("YES");
        else puts("NO");
}
/*
4 3 5
2 1
3 1
4 3

78 100 3 1
5 50 3 4
61 100 1 2

37 3 4
3 2 1
83 2 1
19 2 1
27 3 4
*/
