#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 50;
const long long mod = 100000007;
struct edge {
  long long to, w;
};
vector<edge> e;
vector<edge> g[maxn];
long long siz[maxn];
long long ans = 0;
long long s;
int n;
priority_queue<pair<long long, pair<long long, long long>>> q;
void dfs(int x, int fa) {
  long long num = 0;
  for (edge i : g[x]) {
    long long to = i.to, w = i.w;
    if (to != fa) {
      dfs(to, x);
      num += siz[to];
    }
  }
  if (num == 0) num = 1;
  siz[x] = num;
}
void dfs2(int x, int fa) {
  for (edge i : g[x]) {
    long long to = i.to, w = i.w;
    if (to != fa) {
      dfs2(to, x);
      long long cnt = siz[to] * w;
      q.push({(w + 1) / 2 * siz[to], {w / 2, siz[to]}});
      ans += cnt;
    }
  }
}
int main() {
  int T;
  cin >> T;
  while (T--) {
    cin >> n >> s;
    e.clear();
    ans = 0;
    for (int i = 1; i <= n; i++) g[i].clear(), siz[i] = 0;
    for (int u, v, w, i = 1; i <= n - 1; i++) {
      cin >> u >> v >> w;
      g[u].push_back({v, w});
      g[v].push_back({u, w});
      e.push_back({v, w});
    }
    dfs(1, 0);
    while (q.size()) q.pop();
    ans = 0;
    dfs2(1, 0);
    long long res = ans - s;
    long long now = 0, need = 0;
    while (1) {
      if (res <= 0) {
        printf("%lld\n", need);
        break;
      }
      ++need;
      long long de = q.top().first, w = q.top().second.first,
                num = q.top().second.second;
      q.pop();
      res -= de;
      q.push({(w + 1) / 2 * num, {w / 2, num}});
    }
  }
  return 0;
}
