#include <bits/stdc++.h>
using namespace std;
int n, l, w, x, val, sz[100005], vis[100005], fe[100005 + 1005];
long long int ans;
vector<pair<int, long long int> > v[100005], kullan;
int calc_sub(int node, int ata) {
  sz[node] = 0;
  for (int i = 0; i < (int)v[node].size(); i++) {
    int go = v[node][i].first;
    if (go == ata || vis[go] == 1) continue;
    sz[node] += calc_sub(go, node);
  }
  return ++sz[node];
}
int f_cen(int node, int ata, int siz) {
  for (int i = 0; i < (int)v[node].size(); i++) {
    int go = v[node][i].first;
    if (go != ata && vis[go] == 0 && sz[go] > siz / 2) {
      return f_cen(go, node, siz);
    }
  }
  return node;
}
void dfs(int node, int ata, long long int ww, int ll) {
  kullan.push_back(make_pair(ww, ll));
  for (int i = 0; i < (int)v[node].size(); i++) {
    int go = v[node][i].first;
    if (go == ata || vis[go] == 1) continue;
    dfs(go, node, ww + v[node][i].second, ll + 1);
  }
}
void update(int node, int val) {
  for (node++; node < 100005; node += node & -node) {
    fe[node] += val;
  }
}
int quer(int node) {
  int res = 0;
  for (node++; node > 0; node -= node & -node) {
    res += fe[node];
  }
  return res;
}
long long int calc() {
  long long int ret = 0;
  int j = (int)kullan.size() - 1;
  sort(kullan.begin(), kullan.end());
  for (int i = 0; i < (int)kullan.size(); i++) {
    update(kullan[i].second, 1);
  }
  for (int i = 0; i < (int)kullan.size(); i++) {
    while (j >= i && kullan[i].first + kullan[j].first > w) {
      update(kullan[j].second, -1);
      j--;
    }
    if (i > j) break;
    update(kullan[i].second, -1);
    ret += quer(l - kullan[i].second);
  }
  return ret;
}
void solve(int cur) {
  int cen = f_cen(cur, -1, calc_sub(cur, -1));
  kullan.clear();
  dfs(cen, -1, 0, 0);
  ans += calc();
  for (int i = 0; i < (int)v[cen].size(); i++) {
    int go = v[cen][i].first;
    if (vis[go] == 1) continue;
    kullan.clear();
    dfs(go, cen, v[cen][i].second, 1);
    ans -= calc();
  }
  vis[cen] = 1;
  for (int i = 0; i < (int)v[cen].size(); i++) {
    int go = v[cen][i].first;
    if (vis[go] == 0) solve(go);
  }
}
int main() {
  scanf("%d %d %d", &n, &l, &w);
  for (int i = 2; i <= n; i++) {
    scanf("%d %d", &x, &val);
    v[x].push_back(make_pair(i, val));
    v[i].push_back(make_pair(x, val));
  }
  solve(1);
  printf("%lld\n", ans);
  return 0;
}
