#include<iostream>
#include<stack>
#include<vector>
#include<queue>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=4e5+10,mod=1e9+7,inf=1e9+7;
inline int read(){
char c=getchar();int x=0,f=1;
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
return x*f;
}
int n,m,a[N],k,fa[N],ans=0,mx=0;
struct mm{
int x,y,k,c;
}e[N];
bool cmp(mm x,mm y){
return x.k<y.k;
}
int find(int x){
if(x==fa[x])
return x;
return fa[x]=find(fa[x]);
}
signed main(){
n=read();
m=read();
k=read();
for(int i=1;i<=n;i++)
fa[i]=i;
for(int i=1;i<=m;i++){
e[i].x=read();
e[i].y=read();
e[i].k=read();
}
sort(e+1,e+m+1,cmp);
int cnt=0;
for(int i=1;i<=m;i++){
int u=find(e[i].x),v=find(e[i].y);
if(u==v)
continue;
fa[u]=v;
mx=max(mx,e[i].k);
if(mx>k)
ans+=mx-k;
cnt++;
if(cnt==n-1)
break;
}
if(mx<k){
ans=inf;
for(int i=1;i<=m;i++)
ans=min(ans,abs(e[i].k-k));
}
cout<<ans;
return 0;
}