#include <cstdio>
#include <algorithm>
using namespace std;
const int max_n = 1e4 + 5;
int n, k;
struct Edge {
int to, next, val;
} edge[max_n * 2];
int head[max_n];
int ans = 0;
bool vis[max_n];
int mx_son[max_n], sze[max_n];
int Find_Center(int p, int f, int tot) {
int res = 0;
sze[p] = 1;
mx_son[p] = 0;
for (int i = head[p]; i; i = edge[i].next) {
if (vis[edge[i].to])continue;
if (edge[i].to == f)continue;
int tmp = Find_Center(edge[i].to, p, tot);
if (mx_son[tmp] < mx_son[res])res = tmp;
sze[p] += sze[edge[i].to];
mx_son[p] = max(mx_son[p], sze[edge[i].to]);
}
mx_son[p] = max(mx_son[p], tot - sze[p]);
if (mx_son[p] < mx_son[res])res = p;
return res;
}
struct Distance {
int val, bel;
bool operator<(const Distance &tmp) const { return val < tmp.val; }
} dis[max_n];
int cnt[max_n], num_dis = 0, num_typ = 0;
void dfs(int p, int f, int dep) {
dis[++num_dis] = {dep, num_typ};
cnt[num_typ]++;
sze[p] = 1;
for (int i = head[p]; i; i = edge[i].next) {
if (vis[edge[i].to])continue;
if (edge[i].to == f)continue;
dfs(edge[i].to, p, dep + edge[i].val);
sze[p] += sze[edge[i].to];
}
}
void Solve(int p, int tot) {
if (tot <= 1)return;
int o = Find_Center(p, 0, tot);
num_dis = 0, num_typ = 0;
for (int i = head[o]; i; i = edge[i].next) {
if (vis[edge[i].to])continue;
cnt[++num_typ] = 0;
dfs(edge[i].to, o, edge[i].val);
}
sort(dis + 1, dis + 1 + num_dis);
int R = num_dis;
for (int L = 1; L <= num_dis; L++) {
cnt[dis[L].bel]--;
while (R > 0 && dis[L].val + dis[R].val > k)cnt[dis[R--].bel]--;
if (L < R)ans += (R - L - cnt[dis[L].bel]);
if (dis[L].val <= k)ans++;
}
vis[o] = true;
for (int i = head[o]; i; i = edge[i].next) {
if (vis[edge[i].to])continue;
Solve(edge[i].to, sze[edge[i].to]);
}
}
signed main() {
// freopen("in", "r", stdin), freopen("out", "w", stdout);
mx_son[0] = 0x3f3f3f3f;
while (scanf("%d %d", &n, &k) != EOF) {
if (n == 0 && k == 0)break;
for (int i = 1; i <= n; i++)head[i] = 0;
for (int i = 1, tot = 1; i < n; i++) {
int u, v, w;
scanf("%d %d %d", &u, &v, &w);
u++, v++;
edge[++tot] = {v, head[u], w}, head[u] = tot;
edge[++tot] = {u, head[v], w}, head[v] = tot;
}
ans = 0;
for (int i = 1; i <= n; i++)vis[i] = false;
Solve(1, n);
printf("%d\n", ans);
}
return 0;
}