#include<cstdio>
#include<cctype>
#include<queue>
#include<cstring>
#include<algorithm>
#define L T[o].lc
#define R T[o].rc
#define rep(i,s,t) for(int i=s;i<=t;i++)
#define dwn(i,s,t) for(int i=s;i>=t;i--)
#define ren for(int i=first[x];i;i=next[i])
using namespace std;
const int BufferSize=1<<16;
char buffer[BufferSize],*head,*tail;
inline char Getchar() {
if(head==tail) {
int l=fread(buffer,1,BufferSize,stdin);
tail=(head=buffer)+l;
}
return *head++;
}
inline int read() {
int x=0,f=1;char c=Getchar();
for(;!isdigit(c);c=Getchar()) if(c==‘-‘) f=-1;
for(;isdigit(c);c=Getchar()) x=x*10+c-‘0‘;
return x*f;
}
const int maxn=250010;
const int inf=2e9;
int n,len,D,rt,ToT;
int x[maxn],y[maxn],p[maxn];
struct Node {
int x[2],mx[2],mn[2],minv,del;
int lc,rc,val;
bool operator < (const Node& ths) const {
if(ths.x[D]!=x[D]) return x[D]<ths.x[D];
if(ths.x[D^1]!=x[D^1]) return x[D^1]<ths.x[D^1];
return val<ths.val;
}
bool operator == (const Node& ths) const {
return x[0]==ths.x[0]&&x[1]==ths.x[1]&&val==ths.val;
}
}T[maxn],A;
void maintain(int o) {
T[o].minv=min(T[L].minv,T[R].minv);
if(!T[o].del) {
T[o].minv=min(T[o].minv,T[o].val);
T[o].mx[0]=T[o].mn[0]=T[o].x[0];
T[o].mx[1]=T[o].mn[1]=T[o].x[1];
}
rep(c,0,1) {
T[o].mx[c]=max(T[o].mx[c],max(T[L].mx[c],T[R].mx[c]));
T[o].mn[c]=min(T[o].mn[c],min(T[L].mn[c],T[R].mn[c]));
}
}
void insert(int& o,int cur) {
if(!o) T[o=++ToT]=A;
else D=cur,insert(A<T[o]?L:R,cur^1);
maintain(o);
}
void remove(int& o,int cur) {
if(!o) {puts("2333");return;}
if(!T[o].del&&T[o]==A) T[o].del=1;
else D=cur,remove(A<T[o]?L:R,cur^1);
maintain(o);
}
int query(int& o,int a,int b) {
if(!o) return inf;
int res=inf;
if(T[o].mn[0]>b||T[o].mn[1]>a) return inf;
if(T[o].mx[0]<=b&&T[o].mx[1]<=a) return T[o].minv;
if(!T[o].del&&T[o].x[0]<=b&&T[o].x[1]<=a) res=min(res,T[o].val);
if(T[L].mn[0]<=b&&T[L].mn[1]<=a) res=min(res,query(L,a,b));
if(T[R].mn[0]<=b&&T[R].mn[1]<=a) res=min(res,query(R,a,b));
return res;
}
void build(int& o,int l,int r,int cur) {
o=0;if(l>r) return;
int mid=l+r>>1;o=mid;D=cur;
nth_element(T+l,T+mid,T+r+1);
build(L,l,mid-1,cur^1);
build(R,mid+1,r,cur^1);
maintain(o);
}
void rebuild() {
int m=0;
rep(i,1,ToT) if(!T[i].del) T[++m]=T[i];
build(rt,1,ToT=m,0);
}
int f[maxn];
int main() {
T[0].mx[0]=T[0].mx[1]=-inf;
T[0].mn[0]=T[0].mn[1]=T[0].minv=inf;
n=read();len=read();x[1]=0;y[1]=inf;
rep(i,2,n) x[i]=read(),y[i]=read(),p[i]=read();
int cur=1;A.x[0]=0;A.x[1]=-inf;A.val=0;
insert(rt,0);
rep(i,2,n) {
f[i]=inf;
while(p[i]-p[cur]>len) {
A.x[0]=x[cur];A.x[1]=-y[cur];A.val=f[cur];
remove(rt,0);cur++;
}
f[i]=min(f[i],query(rt,-x[i],y[i])+1);
A.x[0]=x[i];A.x[1]=-y[i];A.val=f[i];insert(rt,0);
if(i%800==0) rebuild();
}
rep(i,2,n) printf("%d\n",f[i]==inf?-1:f[i]);
return 0;
}