#include <bits/stdc++.h>
using namespace std;
const double PI = acos(-1);
const long long INF = 1LL << 62;
const long long MINF = -(1LL << 62);
template <typename T>
T getint() {
  T val = 0;
  char c;
  bool neg = false;
  while ((c = getchar()) && !(c >= '0' && c <= '9')) {
    neg |= c == '-';
  }
  do {
    val = (val * 10) + c - '0';
  } while ((c = getchar()) && (c >= '0' && c <= '9'));
  return val * (neg ? -1 : 1);
}
struct el {
  long long to;
  long long w;
};
long long n, s;
vector<el> adj[100001];
long long sz[100001];
int st[100001];
struct parok {
  long long w, cnt, ind;
  long long can() const { return w * cnt - (w / 2) * cnt; }
  bool operator<(const parok& masik) const {
    if (can() == masik.can()) return ind < masik.ind;
    return can() < masik.can();
  }
};
set<parok> lst;
long long sum = 0;
void dfs(int x) {
  st[x] = 1;
  int cnt = 0;
  for (auto i : adj[x]) {
    if (!st[i.to]) {
      cnt++;
      dfs(i.to);
      sz[x] += sz[i.to];
      lst.insert(parok{i.w, sz[i.to], i.to});
      sum += i.w * sz[i.to];
    }
  }
  if (cnt == 0) sz[x] = 1;
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  int T;
  cin >> T;
  while (T--) {
    cin >> n >> s;
    for (int i = 1; i <= n; ++i) {
      sz[i] = 0;
      adj[i].clear();
      st[i] = 0;
    }
    lst.clear();
    for (int i = 1; i < n; ++i) {
      int a, b, c;
      cin >> a >> b >> c;
      adj[a].push_back({b, c});
      adj[b].push_back({a, c});
    }
    sum = 0;
    dfs(1);
    int ans = 0;
    while (sum > s) {
      auto akt = *prev(lst.end());
      lst.erase(prev(lst.end()));
      sum -= akt.w * akt.cnt;
      akt.w /= 2;
      sum += akt.w * akt.cnt;
      lst.insert(parok{akt.w, akt.cnt, akt.ind});
      ans++;
    }
    cout << ans << "\n";
  }
  return 0;
}
