#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,m;
int u,v;
ll w;
inline int read() {
int s = 0,f = 1;char ch = getchar();
while (!isdigit(ch)) f = ch == '-' ? -1 : 1, ch = getchar();
while (isdigit(ch)) s = (s << 3) + (s << 1) + ch - '0', ch = getchar();
return s*f;
}
const int N=5e5+5,inf=2e9;
int head[N],ecnt;
struct edge{
int v,nxt;
ll w;
}e[N<<1];
void add(int u,int v,ll w){
e[++ecnt].v=v;
e[ecnt].nxt=head[u];
e[ecnt].w=w;
head[u]=ecnt;
}
int fa[N],siz[N],son[N];
ll dep[N];
void dfs(int u,int father,int d){
dep[u]=d;
siz[u]=1;
fa[u]=father;
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].v;
if(v!=father){
dfs(v,u,d+e[i].w);
siz[u]+=siz[v];
if(siz[son[u]]<siz[v]) son[u]=v;
}
}
}
ll num[N],cnt;
void init(){
dfs(1,0,0);
for(int i=1;i<=n;i++){
num[++cnt]=dep[i];
}
sort(num+1,num+cnt+1);
cnt=unique(num+1,num+cnt+1)-num-1;
for(int i=1;i<=n;i++){
dep[i]=lower_bound(num+1,num+cnt+1,dep[i])-num;
}
}
struct node{
int x,y;
int dep;
};
vector<node> vec[N];
set<int> st[N];
int rt[N],rtcnt;
void insert(int lca,int v){
int l=*(--st[rt[lca]].lower_bound(v));
int r=*(st[rt[lca]].lower_bound(v));
if(l) vec[dep[lca]].push_back((node){l,v});
if(r!=inf) vec[dep[lca]].push_back((node){v,r});
}
void dfs2(int u,int lca){
insert(lca,u);
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].v;
if(v!=fa[u]){
dfs2(v,lca);
}
}
st[rt[lca]].insert(u);
}
void DSU(int u){
if(!son[u]){
rt[u]=++rtcnt;
st[rt[u]].insert(u);
st[rt[u]].insert(0);
st[rt[u]].insert(inf);
vec[dep[u]].push_back({u,u});
return ;
}
else{
DSU(son[u]);
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].v;
if(v!=fa[u]&&v!=son[u]) DSU(v);
}
rt[u]=rt[son[u]];
vec[dep[u]].push_back({u,u});
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].v;
if(v!=fa[u]&&v!=son[u]){
dfs2(v,u);
}
}
st[rt[u]].insert(u);
}
}
struct tree{
int f[N<<2];
void upd(int x,int k){
while(x<=n){
f[x]+=k;
x+=x&(-x);
}
}
int query(int x){
int ans=0;
while(x>0){
ans+=f[x];
x-=x&(-x);
}
return ans;
}
}T;
struct Q{
int l,r,ans,id;
}q[N];
vector<int> vq[N];
vector<node> va[N];
int lst[N];
void QUERIES(){
for(int i=1;i<=m;i++){
q[i].l=read(),q[i].r=read();
q[i].id=i;
vq[q[i].r].push_back(i);
}
for(int i=1;i<=cnt;i++){
for(int j=0;j<vec[i].size();j++){
vec[i][j].dep=i;
va[vec[i][j].y].push_back(vec[i][j]);
}
}
for(int i=1;i<=n;i++){
for(int j=0;j<va[i].size();j++){
node now=va[i][j];
if(lst[now.dep]==0){
lst[now.dep]=now.x;
T.upd(lst[now.dep],1);
}
else if(lst[now.dep]<now.x){
T.upd(lst[now.dep],-1);
lst[now.dep]=now.x;
T.upd(lst[now.dep],1);
}
}
for(int j=0;j<vq[i].size();j++){
q[vq[i][j]].ans=T.query(i)-T.query(q[vq[i][j]].l-1);
}
}
for(int i=1;i<=m;i++) printf("%d\n",q[i].ans);
}
int main(){
cin>>n>>m;
for(int i=1;i<n;i++){
u=read(),v=read(),w=read();
add(u,v,w),add(v,u,w);
}
init();
DSU(1);
QUERIES();
return 0;
}