#include <bits/stdc++.h>
using namespace std;
const long long N = 2e5;
const long long inf = 1e9 + 7;
inline long long read() {
  register long long s = 0;
  register bool neg = 0;
  register char c = getchar();
  for (; c < '0' || c > '9'; c = getchar()) neg |= (c == '-');
  for (; c >= '0' && c <= '9'; s = s * 10 + (c ^ 48), c = getchar())
    ;
  return (neg ? -s : s);
}
long long t, a, b, son[N + 10], sum;
struct Dis {
  long long son, dis;
  bool operator<(const Dis &o) const {
    return son * (dis - dis / 2) < o.son * (o.dis - o.dis / 2);
  }
};
vector<pair<long long, long long> > st[N + 10];
priority_queue<Dis> qu;
inline void dfs(long long n, long long fa) {
  bool p = 0;
  for (long long i = 0; i < st[n].size(); i++) {
    long long v = st[n][i].first, val = st[n][i].second;
    if (v == fa) continue;
    p = 1;
    dfs(v, n);
    son[n] += son[v];
    sum += son[v] * val;
    qu.push((Dis){son[v], val});
  }
  if (!p) son[n] = 1;
}
signed main() {
  t = read();
  while (t--) {
    while (!qu.empty()) qu.pop();
    memset(son, 0, sizeof(son));
    a = read();
    b = read();
    for (long long i = 1; i <= a; i++) st[i].clear();
    long long x, y, z;
    for (long long i = 1; i < a; i++) {
      x = read();
      y = read();
      z = read();
      st[x].push_back(make_pair(y, z));
      st[y].push_back(make_pair(x, z));
    }
    sum = 0;
    dfs(1, 0);
    long long ans = 0;
    while (sum > b && !qu.empty()) {
      Dis k = qu.top();
      qu.pop();
      sum -= (k.dis - k.dis / 2) * k.son;
      k.dis /= 2;
      qu.push(k);
      ans++;
    }
    printf("%lld\n", ans);
  }
  return 0;
}
