#include <algorithm>
#include <cstdio>
#include <iostream>
#include <unordered_set>
#include <utility>
#include <vector>
using namespace std;
const int N = 5145;
const int Log = 20;
int n;
int m;
vector<pair<int, long long> > tree[N];
int dep[N];
int fa[Log][N];
long long d[N];
void dfs (int now, int dad) {
for (auto pa : tree[now]) {
int son = pa.first;
long long dis = pa.second;
if (dad == son) {
continue;
}
dep[son] = dep[now] + 1;
fa[0][son] = now;
for (int i = 1; i < Log; i++) {
fa[i][son] = fa[i - 1][fa[i - 1][son]];
}
d[son] = d[now] + dis;
dfs (son, now);
}
}
int lca (int u, int v) {
if (dep[u] < dep[v]) {
swap (u, v);
}
for (int i = Log - 1; i >= 0; i--) {
if (dep[fa[i][u]] >= dep[v]) {
u = fa[i][u];
}
}
if (u == v) {
return u;
}
for (int i = Log - 1; i >= 0; i--) {
if (fa[i][u] != fa[i][v]) {
u = fa[i][u];
v = fa[i][v];
}
}
return fa[0][u];
}
int main () {
freopen ("rldcot.in", "r", stdin);
freopen ("rldcot.out", "w", stdout);
cin >> n >> m;
for (int i = 1; i < n; i++) {
int u, v, w;
cin >> u >> v >> w;
tree[u].emplace_back(v, w);
tree[v].emplace_back(u, w);
}
dfs (1, 0);
for (int i = 1; i <= m; i++) {
int l, r;
cin >> l >> r;
unordered_set<int> s;
for (int j = l; j <= r; j++) {
for (int k = j; k <= r; k++) {
// cout << j << ' ' << k << endl;
// cout << d[lca (j, k)] << endl;
s.insert(d[lca (j, k)]);
}
}
cout << s.size() << endl;
}
return 0;
}