#include <bits/stdc++.h>
using namespace std;
struct node
{
int y,len;
};
int n,m,t,c[10005],d[10005],ta,tb,tt,e[10005],se[10005],ans;
vector <node> a[10005],b[10005];
bool flag[10005],vis[10005];
priority_queue <pair <int,int>,vector <pair <int,int> >,greater <pair <int,int> > > q;
void dijk (int x)
{
memset (d,127,sizeof (d));
d[x]=0;
q.push (make_pair (0,x));
while (!q.empty ())
{
int td=q.top ().first,ti=q.top ().second;
q.pop ();
if (flag[td])
{
continue;
}
flag[td]=true;
for (int i=0;i<a[ti].size ();i++)
{
if (d[a[ti][i].y]>d[ti]+a[ti][i].len)
{
d[a[ti][i].y]=d[ti]+a[ti][i].len;
q.push (make_pair (d[a[ti][i].y],a[ti][i].y));
}
}
}
}
void tree ()
{
for (int i=1;i<=n;i++)
{
for (int j=0;j<a[i].size ();i++)
{
if (d[a[i][j].y]==d[i]+a[i][j].len&&!flag[a[i][j].y])
{
flag[a[i][j].y]=true;
vis[i]=true;
b[i].push_back (node {a[i][j].y,a[i][j].len});
b[a[i][j].y].push_back (node {i,a[i][j].len});
}
}
}
}
void dfs (int x)
{
se[x]=1;
for (int i=0;i<a[x].size ();i++)
{
if (!vis[a[x][i].y])
{
continue;
}
dfs (a[x][i].y);
se[x]=se[x]+se[a[x][i].y];
}
ans=max (ans,(d[x]-t)*se[x]);
}
int main()
{
cin>>n>>m>>t;
for (int i=1;i<=m;i++)
{
cin>>ta>>tb>>tt;
a[ta].push_back (node {tb,tt});
a[tb].push_back (node {ta,tt});
}
dijk (1);
tree ();
dfs (1);
cout<<ans<<endl;
return 0;
}