#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
int n, m, k;
vector<pair<int, long long> > g[N];
long long s;
long long sz[N], edge[N];
long long dfs(int from, int father) {
  sz[from] = 0;
  bool flag = 1;
  for (auto t : g[from]) {
    int to = t.first;
    if (to == father) continue;
    flag = false;
    edge[to] = t.second;
    sz[from] += dfs(to, from);
  }
  sz[from] += flag;
  return sz[from];
}
void HalfDead() {
  cin >> n;
  cin >> s;
  for (int i = 0; i < (int)n + 2; ++i) {
    g[i].clear();
    edge[i] = 0;
    sz[i] = 0;
  }
  int x, y;
  long long c;
  for (int i = 1; i < n; ++i) {
    cin >> x >> y >> c;
    g[x].push_back({y, c});
    g[y].push_back({x, c});
  }
  dfs(1, -1);
  long long tot = 0;
  for (int i = 1; i <= n; ++i) {
    tot += 1LL * sz[i] * edge[i];
  }
  priority_queue<pair<long long, pair<long long, long long> > > pq;
  for (int i = 1; i <= n; ++i) {
    long long profit = (edge[i] - edge[i] / 2) * sz[i];
    pq.push({profit, {edge[i] / 2, sz[i]}});
  }
  long long ans = 0LL;
  while (!pq.empty()) {
    if (tot <= s) {
      break;
    }
    auto tp = pq.top();
    pq.pop();
    ans += 1;
    tot -= tp.first;
    long long current = tp.second.first;
    long long cur_sz = tp.second.second;
    long long profit = 1LL * (current - current / 2) * cur_sz;
    pq.push({profit, {current / 2, cur_sz}});
  }
  cout << ans << endl;
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(nullptr);
  int tc = 1;
  cin >> tc;
  while (tc--) {
    HalfDead();
  }
  return 0;
}
