#include<bits/stdc++.h>
#define N 5001
#define M 200001
using namespace std;
int n,m,cnt[2],h[2][N],to[2][M],nex[2][M],V[N],ans;
double Merge,w[2][M],dis[N];
struct D{
int k;double d;
D(){}
D(int a,double b){
k=a,d=b;
}
bool operator < (const D &a) const{
return d>a.d;
}
};
struct Node{
int v;
double g,f;
Node(){}
Node(double a,double b,int c){
g=a,f=b,v=c;
}
bool operator < (const Node &a) const{
return f>a.f;
}
};
inline void Edge(int a,int b,double c,int x){
to[x][++cnt[x]]=b;
nex[x][cnt[x]]=h[x][a];
h[x][a]=cnt[x];
w[x][cnt[x]]=c;
}
inline void Dij(int st){
priority_queue<D> q;
for(int i=0;i<=n;++i)dis[i]=INT_MAX*1.0;
dis[st]=0.0;
q.push(D(st,0.0));
while(!q.empty()){
D now=q.top();q.pop();
if(V[now.k])continue;
V[now.k]=1;
for(int i=h[1][now.k];i;i=nex[1][i]){
int v=to[1][i];
if(V[v])continue;
if(dis[v]>dis[now.k]+w[1][i]){
dis[v]=dis[now.k]+w[1][i];
q.push(D(v,dis[v]));
}
}
}
}
inline void Tree(int S,int T){
priority_queue<Node> E;
int tot=0;
if(dis[S]==dis[0])return;
E.push(Node(0,dis[S],S));
while(!E.empty()){
Node now=E.top();E.pop();
if(now.g>Merge)break;
if(now.v==T){
++ans,Merge-=now.g;continue;
}
for(int i=h[0][now.v];i;i=nex[0][i]){
int v=to[0][i];
E.push(Node(now.g+w[0][i],now.g+w[0][i]+dis[v],v));
}
}
}
int main(){
ios::sync_with_stdio(false);
cin.tie(NULL);cout.tie(NULL);
cin>>n>>m>>Merge;
for(int i=1;i<=m;++i){
int a,b;double c;
cin>>a>>b>>c;
Edge(b,a,c,1);
Edge(a,b,c,0);
}
Dij(n);
Tree(1,n);
cout<<ans;
return 0;
}