/*
TASK:capital
LANG:C++
*/


#include<stdio.h>
#include<vector>
#include<queue>
//#include<conio.h>
using namespace std;
unsigned long int d[10001];
struct A
{
int v;
unsigned long int dist;
bool operator< (A i)
        const {
        return dist>i.dist;
        }
};
vector < vector <A> > matrix;
bool used[10001];
priority_queue <A> q;
unsigned long int N,K,M,B,C;

int main()
{
//cin>>N>>K;
//clrscr();
//freopen("test.txt","r",stdin);
scanf("%ld %ld",&N,&K);
int i;

for(i=0;i<=N;i++)
        {vector <A> temp;
        matrix.push_back(temp);
        }



while(1)
{
//cin>>A>>B>>C;
scanf("%ld %ld %ld",&M,&B,&C);
if(M==0||B==0||C==0) break;
A temp;
temp.v=B;
temp.dist=C;
matrix[M].push_back(temp);
temp.v=M;
matrix[B].push_back(temp);
}
int j;

for(i=1;i<=N;i++)
       d[i]=4000000000;

d[1]=0;
unsigned long int vertex=1;
while(1)
{
used[vertex]=1;


for(i=0;i<matrix[vertex].size();i++)
        if(d[matrix[vertex][i].v]>d[vertex]+matrix[vertex][i].dist)
        {
        A temp;
        d[matrix[vertex][i].v]=d[vertex]+matrix[vertex][i].dist;

        temp.v=matrix[vertex][i].v;
        temp.dist=matrix[vertex][i].dist;
        q.push(temp);
        }

  while(used[q.top().v]&&!q.empty())
  {
  q.pop();
  }

  if(!q.empty())
  vertex=q.top().v;
  else break;
}
long int br=0;

for(i=1;i<=N;i++)
        //printf("%ld ",d[i]);
        //printf("\n");
      if(d[i]>K) br++;

      printf("%ld",br);
//for(i=1;i<=N;i++)
  //   { for(j=0;j<matrix[i].size();j++)
    //            printf("%ld ",matrix[i][j].v);
      //          printf("\n");
     //}

return 0;
}
