#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 10;
int n;
long long s;
vector<int> g[maxn];
map<pair<int, int>, long long> weight;
vector<pair<long long, int>> c;
class ComparisionClass {
 public:
  bool operator()(pair<long long, int> a, pair<long long, int> b) {
    long long t1 = 0;
    long long t2 = 0;
    if (a.first % 2 == 1)
      t1 = (a.first * a.second - a.second) / 2;
    else
      t1 = (a.first * a.second) / 2;
    if (b.first % 2 == 1)
      t2 = (b.first * b.second - b.second) / 2;
    else
      t2 = (b.first * b.second) / 2;
    return a.first * a.second - t1 < b.first * b.second - t2;
  }
};
int dfs(int s, int p) {
  int ans = 0;
  int temp = 0;
  for (auto x : g[s]) {
    if (x != p) {
      ans += dfs(x, s);
      temp = 1;
    }
  }
  if (temp == 0) ans = 1;
  if (p != -1) c.push_back(make_pair(weight[make_pair(s, p)], ans));
  return ans;
}
int main() {
  int t;
  cin >> t;
  while (t--) {
    cin >> n >> s;
    c.clear();
    for (int i = 1; i <= n; i++) {
      g[i].clear();
    }
    weight.clear();
    for (int i = 0; i < n - 1; i++) {
      int x, y;
      long long w;
      cin >> x >> y >> w;
      g[x].push_back(y);
      g[y].push_back(x);
      weight[make_pair(x, y)] = w;
      weight[make_pair(y, x)] = w;
    }
    dfs(1, -1);
    priority_queue<pair<long long, int>, vector<pair<long long, int>>,
                   ComparisionClass>
        q;
    long long sum = 0;
    for (int i = 0; i < c.size(); i++) {
      q.push(c[i]);
      sum += c[i].first * c[i].second;
    }
    int step = 0;
    while (!q.empty()) {
      if (sum <= s) break;
      pair<long long, int> temp = q.top();
      q.pop();
      long long half = 0;
      if (temp.first % 2)
        half = (temp.first * temp.second - temp.second) / 2;
      else
        half = (temp.first * temp.second) / 2;
      sum -= (temp.first * temp.second) - half;
      q.push(make_pair(temp.first / 2, temp.second));
      step++;
    }
    cout << step << endl;
  }
  return 0;
}
