#include <bits/stdc++.h>
using namespace std;
const double EPS = 1e-6;
const int INF = ~(1 << 31);
const long long LINF = ~(1LL << 63);
const int MOD = 1e9 + 7;
const long long MAXN = 1e5;
const long long MAXV = 1e9 + 10;
void fail() {
  cout << "No";
  exit(0);
}
struct e {
  long long v, u, w;
  int idx;
};
void dfs(int v, int p, vector<vector<e>>& g, vector<int>& vc, vector<int>& ec) {
  if (g[v].size() == 1 && v != 0) {
    vc[v] = 1;
    return;
  }
  for (int i = 0; i < g[v].size(); ++i) {
    e& edge = g[v][i];
    if (edge.u != p) {
      dfs(edge.u, v, g, vc, ec);
      ec[edge.idx] = vc[edge.u];
      vc[v] += ec[edge.idx];
    }
  }
}
int main() {
  cin.tie(0);
  ios_base::sync_with_stdio(0);
  int t, n, v, u, w;
  long long s;
  cin >> t;
  for (int k = 0; k < t; ++k) {
    cin >> n >> s;
    vector<vector<e>> g = vector<vector<e>>(n, vector<e>());
    vector<e> edges(n - 1);
    for (int i = 0; i < n - 1; ++i) {
      cin >> v >> u >> w;
      v--, u--;
      edges[i] = {v, u, w, i};
      g[v].push_back({v, u, w, i});
      g[u].push_back({u, v, w, i});
    }
    vector<int> vc(n);
    vector<int> ec(n - 1);
    dfs(0, -1, g, vc, ec);
    long long sum = 0;
    priority_queue<pair<long long, long long>,
                   vector<pair<long long, long long>>>
        q;
    for (int i = 0; i < n - 1; ++i) {
      sum += 1LL * edges[i].w * ec[i];
      q.push(make_pair(1LL * (edges[i].w - edges[i].w / 2) * ec[i], i));
    }
    long long ans = 0;
    while (sum > s) {
      pair<long long, long long> p = q.top();
      q.pop();
      e& edge = edges[p.second];
      sum -= p.first;
      edge.w /= 2;
      q.push(make_pair(1LL * (edge.w - edge.w / 2) * ec[edge.idx], edge.idx));
      ans++;
    }
    cout << ans << "\n";
  }
}
