#include <bits/stdc++.h>
using namespace std;
struct DSU {
vector<int> a;
vector<int> b;
int n;
DSU (int N) {
n = N;
a.resize(n);
b.resize(n);
for(int i = 0; i < n; i ++) {
a[i] = i;
b[i] = 1;
}
}
int leader(int x) {
if(a[x] == x)
return x;
return a[x] = leader(a[x]);
}
void merge(int x, int y) {
x = leader(x);
y = leader(y);
if(b[x] < b[y])
swap(x, y);
b[x] += b[y];
a[y] = x;
}
int size(int x) {
return b[leader(x)];
}
};
struct lol {
int x, y, c;
};
bool cmp1(lol a, lol b) {
return a.c > b.c;
}
bool cmp2(lol a, lol b) {
return a.x > b.x;
}
bool cmp3(lol a, lol b) {
return a.c < b.c;
}
int main() {
freopen("mootube.in", "r", stdin);
freopen("mootube.out", "w", stdout);
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
int n, q; cin >> n >> q;
DSU dsu(n);
vector<lol> a(n);
for(int i = 0; i < n - 1; i ++) {
cin >> a[i].x >> a[i].y >> a[i].c;
a[i].x --; a[i].y --;
}
vector<lol> b(q);
for(int i = 0; i < q; i ++) {
cin >> b[i].x >> b[i].y; b[i].y --;
b[i].c = i;
}
sort(a.begin(), a.end(), cmp1);
sort(b.begin(), b.end(), cmp2);
for(int i = 0, j = 0; i < q; i ++) {
while(j < n && a[j].c >= b[i].x) {
dsu.merge(a[j].x, a[j].y);
j ++;
}
b[i].x = dsu.size(b[i].y) - 1;
}
sort(b.begin(), b.end(), cmp3);
for(int i = 0; i < q; i ++) {
cout << b[i].x << '\n';
}
}