#include<bits/stdc++.h>
#define forUp(i,a,b) for(int i=(a);i<=(b);++i)
#define forUP(i,a,b) for(int i=(a);i<(b);++i)
#define forDown(i,a,b) for(int i=(a);i>=(b);--i)
#define forG(u,v) for(int __i=head[u],v=to[__i];__i;__i=nxt[__i],v=to[__i])
#define forWG(u,v,c) for(int __i=head[u],v=to[__i],c=w[__i];__i;__i=nxt[__i],v=to[__i],c=w[__i])
#define pushb push_back
#define popb pop_back
#define pushf push_front
#define popf pop_front
#define popc __builtin_popcount
#define popc64 __builtin_popcountll
#define seteps(n) fixed<<setprecision(n)
bool __mst;using uint=unsigned int;using int64=long long;using uint64=unsigned long long;using int128=__int128;using uint128=unsigned __int128;using float64=double;using float80=long double;
constexpr int INF=0x3f3f3f3f,MINF=0xcfcfcfcf;constexpr int64 INF64=0x3f3f3f3f3f3f3f3f,MINF64=0xcfcfcfcfcfcfcfcf;constexpr float64 INFDB=1e50,eps=1e-6;
template<class _Tp>inline void chkMax(_Tp &x,const _Tp &y){if(x<y)x=y;}template<class _Tp>inline void chkMin(_Tp &x,const _Tp &y){if(x>y)x=y;}
inline int addMod(const int &x,const int &y,const int mod){int ans=x+y;return ans>=mod?ans-mod:ans;}inline int subMod(const int &x,const int &y,const int mod){int ans=x-y;return ans<0?ans+mod:ans;}
constexpr int N=1e5+10,Q=5e5+10;int __test_num=1,__task_id,__tst;using namespace std;void __init();
int n,q;vector<array<int,2>> G[N];
int DFN,bg[N],ed[N],rk[N],sz[N],hson[N],V;int64 dep[N],lsh[N];
void dfs(int rt=1,int fa=0){
sz[rk[bg[rt]=++DFN]=rt]=1;lsh[++V]=dep[rt];
for(auto [son,len]:G[rt])if(son!=fa){
dep[son]=dep[rt]+len;
dfs(son,rt);
sz[rt]+=sz[son];
hson[rt]=sz[hson[rt]]<sz[son]?son:hson[rt];
}
ed[rt]=DFN;
}
vector<array<int,2>> upd[N],qry[N];int ans[Q];set<int> S;
void solve(int rt=1,int fa=0,bool keep=true){
dep[rt]=lower_bound(lsh+1,lsh+V+1,dep[rt])-lsh;
for(auto [son,len]:G[rt])if(son!=fa&&son!=hson[rt])solve(son,rt,false);
if(hson[rt])solve(hson[rt],rt,true);
for(auto [son,len]:G[rt])if(son!=fa&&son!=hson[rt]){
forUp(dfn,bg[son],ed[son]){
int u=rk[dfn];
auto pre=S.lower_bound(u);if(pre!=S.begin())upd[u].pushb({*--pre,(int)dep[rt]});
auto suf=S.upper_bound(u);if(suf!=S.end())upd[*suf].pushb({u,(int)dep[rt]});
}
forUp(dfn,bg[son],ed[son])S.insert(rk[dfn]);
}
auto pre=S.lower_bound(rt);if(pre!=S.begin())upd[rt].pushb({*--pre,(int)dep[rt]});
auto suf=S.upper_bound(rt);if(suf!=S.end())upd[*suf].pushb({rt,(int)dep[rt]});
S.insert(rt);upd[rt].pushb({rt,(int)dep[rt]});
if(!keep)S.clear();
}
int c[N],lst[N];
void add(int pos,int val){for(pos=n-pos+1;pos<=n;pos+=pos&-pos)c[pos]+=val;}
int ask(int pos){int ans=0;for(pos=n-pos+1;pos;pos&=pos-1)ans+=c[pos];return ans;}
bool __med;void __solve(int __test_id){
cin>>n>>q;
forUP(i,1,n){int u,v,w;cin>>u>>v>>w;G[u].pushb({v,w});G[v].pushb({u,w});}
dfs();sort(lsh+1,lsh+V+1);V=unique(lsh+1,lsh+V+1)-lsh-1;solve();
forUp(i,1,q){int l,r;cin>>l>>r;qry[r].pushb({i,l});}
forUp(i,1,n){
for(auto [l,col]:upd[i])if(lst[col]<l)add(lst[col],-1),add(lst[col]=l,1);
for(auto [qid,l]:qry[i])ans[qid]=ask(l);
}
forUp(i,1,q)cout<<ans[i]<<'\n';
}
signed main(){
__init();
forUp(i,1,__test_num)__solve(i);
cerr<<1000.0*(clock()-__tst)/CLOCKS_PER_SEC<<"ms "<<((&__mst)-(&__med))/1024.0/1024.0<<"MB"<<'\n';
return 0;
}
void __init(){
__tst=clock();
#ifndef use_file
//#define use_file
#endif
#ifdef use_file
const string __file_name="test";freopen((__file_name+".in").c_str(),"r",stdin);freopen((__file_name+".out").c_str(),"w",stdout);
#endif
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
//scanf("%d",&__test_num);
//cin>>__test_num;
}