const int inf = 0x3f3f3f3f;
const int N = 10009;
int dis[N], vis[N];
int size[N], hash[N];
int sum[N];//子孙数 ;
int big[N]; //儿子的最大子孙数
int n, k, ans, cnt;
vector<pair<int, int> >v[N];
void num_child(int s, int pre) //求子孙数
{
sum[s] = 1;
big[s] = 0;
int i, ss;
for(i=0; i<v[s].size(); i++)
{
ss = v[s][i].first;
if(ss==pre || vis[ss]) continue;
num_child(ss, s);
sum[s] += sum[ss];
big[s] = max(big[s], sum[ss]);
}
size[cnt] = big[s];
hash[cnt++] = s;
}
int getroot(int s)//找到以s为根节点的子树的重心
{
cnt = 0;
num_child(s, 0);
int aa = inf, ans, tmp = sum[s];
for(int i=0; i<cnt; i++)
{
size[i] = max(size[i], tmp-size[i]);
if(size[i]<aa)
{
aa = size[i];
ans = hash[i];
}
}
return ans;
}
void distance(int s, int pre, int len) //子树中的每个点到root的距离
{
dis[cnt++] = len;
int i, ss, dd;
for(i=0; i<v[s].size(); i++)
{
ss = v[s][i].first;
dd = v[s][i].second;
if(ss==pre || vis[ss] || len+dd>k) continue;
distance(ss, s, len+dd);
}
}
void count1()
{
sort(dis, dis+cnt);
int l = 0, r = cnt-1;
while(l<r)
{
if(dis[l]+dis[r]<=k) ans+=r-l, l++;
else r--;
}
}
void count2(int s)
{
int ss, dd, i;
for(i=0; i<v[s].size(); i++)
{
ss = v[s][i].first;
dd = v[s][i].second;
if(vis[ss]) continue;
cnt = 0;
distance(ss, s, dd);
sort(dis, dis+cnt);
int l = 0, r = cnt-1;
while(l<r)
{
if(dis[l]+dis[r]<=k) ans-=r-l, l++;
else r--;
}
}
}
void solve(int s, int pre)
{
int root = getroot(s);
vis[root] = 1;
cnt = 0;
distance(root, 0, 0);
count1(); //如果在一个孩子里就会加重复了
//如样例中(3,5)以1为根的之后加一次,以3为根的时候又加一次。
count2(root); //减去在一个孩子里的
for(int i=0; i<v[root].size(); i++)
{
int ss = v[root][i].first;
if(ss!=pre && vis[ss]==0) solve(ss, root);
}
}
int main()
{
int i, a, b, c;
while(scanf("%d%d", &n, &k), n)
{
for(i=1; i<=n; i++) v[i].clear();
memset(vis, 0, sizeof(vis));
ans = 0;
for(i=1; i<n; i++)
{
scanf("%d%d%d", &a, &b, &c);
v[a].push_back(make_pair(b, c));
v[b].push_back(make_pair(a, c));
}
solve(1, 0);
printf("%d\n", ans);
}
return 0;
}