#include <bits/stdc++.h>
#define ll long long
#define sti string
#define bit(n,i) ((n>>i)&1)
#define itachi ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define maxn 200005
#define fi first
#define se second
#define int long long

using namespace std;

int sz[maxn],A,B,n;
int resall=0;
vector<pair<int,int>> vecall,vecin;
struct adja{
    int v,w,c;
};
vector<adja> adj[maxn];
bool banned[maxn];

struct Fenwick{
    int n;
    vector<int> st;
    Fenwick(int _n=0){
        n=_n;
        st.assign(n+5,0);
    }
    void update(int pos,int val){
        for(;pos<=n;pos+=pos&-pos) st[pos]+=val;
    }
    int get(int pos){
        int res=0;
        for(;pos>0;pos-=pos&-pos) res+=st[pos];
        return res;
    }
    void reset(int _n=0){
        n=_n;
        fill(st.begin(),st.begin()+n+5,0);
    }
};

Fenwick tree(200005);

void countChild(int u,int p){
    sz[u]=1;
    for(auto [v,w,c]:adj[u]){
        if(v!=p&&!banned[v]){
            countChild(v,u);
            sz[u]+=sz[v];
        }
    }
}

int find_centroid(int u,int p,int S){
    for(auto [v,w,c]:adj[u]){
        if(v!=p&&!banned[v]&&sz[v]>S/2){
            return find_centroid(v,u,S);
        }
    }
    return u;
}

void dfs(int u,int p,int L,int T){
    vecin.push_back({L,T});
    for(auto [v,w,c]:adj[u]){
        if(v!=p&&!banned[v]) dfs(v,u,L+w,T+c);
    }
}

int calc(vector<pair<int,int>>&vec,int limitL,int limitT){
    if(vec.size()<2) return 0;
    vector<int> comp;
    for(auto [L,W]:vec) comp.push_back(W);
    sort(comp.begin(),comp.end());
    comp.erase(unique(comp.begin(),comp.end()),comp.end());
    sort(vec.begin(),vec.end());
    tree.reset(comp.size());
    int res=0,ptr=0,self=0,m=vec.size();
    for(int i=m-1;i>=0;i--){
        while(ptr<m&&vec[i].fi+vec[ptr].fi<=limitL){
            int pos=lower_bound(comp.begin(),comp.end(),vec[ptr].se)-comp.begin()+1;
            tree.update(pos,1);
            ptr++;
        }
        int pos=upper_bound(comp.begin(),comp.end(),limitT-vec[i].se)-comp.begin();
        res+=tree.get(pos);
        if(2*vec[i].fi<=limitL&&2*vec[i].se<=limitT) self++;
    }
    return (res-self)/2;
}

void solve(int u){
    countChild(u,0);
    u=find_centroid(u,0,sz[u]);
    vecall.clear();
    vecall.push_back({0,0});
    for(auto [v,w,c]:adj[u]){
        if(banned[v]) continue;
        vecin.clear();
        dfs(v,u,w,c);
        for(auto p:vecin) vecall.push_back(p);
        resall-=calc(vecin,A,B);
    }
    resall+=calc(vecall,A,B);
    banned[u]=1;
    for(auto [v,w,c]:adj[u]){
        if(!banned[v]) solve(v);
    }
}

signed main(){
    itachi
    freopen("BRT.inp","r",stdin);
    freopen("BRT.out","w",stdout);
    cin>>n>>A>>B;
    for(int i=1;i<n;i++){
        int u,v,w,c;
        cin>>u>>v>>w>>c;
        adj[u].push_back({v,w,c});
        adj[v].push_back({u,w,c});
    }
    solve(1);
    cout<<resall;
    return 0;
}
