#include<bits/stdc++.h>
using namespace std;
#define mod 998244353
#define inf 0x3f3f3f3f
#define re register
#define maxn 70010
#define int long long
#define Orz cout<<"stO %王队% Orz"<<'\n';
int n,p,k;
struct node
{
int s,t,v,next;
}edge[maxn],edge1[maxn];
int cnt;
int head[maxn],head1[maxn];
void add(int s,int t,int v)
{
edge[++cnt].s=s;
edge[cnt].t=t;
edge[cnt].v=v;
edge[cnt].next=head[s];
head[s]=cnt;
}
int cnt1;
void add1(int s,int t,int v)
{
edge1[++cnt1].s=s;
edge1[cnt1].t=t;
edge1[cnt1].v=v;
edge1[cnt1].next=head1[s];
head1[s]=cnt1;
}
queue<int>Q;
bool v[maxn];
int dis[maxn];
void SPFA()
{
memset(dis,0x3f,sizeof dis);
memset(v,0,sizeof v);
v[1]=1;
dis[1]=0;
Q.push(1);
while(Q.size())
{
int u=Q.front();
Q.pop();
v[u]=0;
for(re int i=head1[u];i;i=edge1[i].next)
{
int tt=edge1[i].t;
int cc=edge1[i].v;
if(dis[tt]>dis[u]+cc)
{
dis[tt]=dis[u]+cc;
if(!v[tt])
v[tt]=true,Q.push(tt);
}
}
}
}
bool P(int x)
{
memset(head1,0,sizeof head1);
int cnt1=0;
for(re int i=1;i<=p;++i)
{
add1(edge[i].s,edge[i].t,edge[i].v>x?1:0);
add1(edge[i].t,edge[i].s,edge[i].v>x?1:0);
}
SPFA();
if(dis[n]>k) return false;
return true;
}
inline int read(){
int x=0,f=1;char ch=getchar();
while (ch<'0'||ch>'9') {if(ch=='-')f=-1; ch=getchar();}
while (ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0'; ch=getchar();}
return x*f;
}
signed main()
{
// freopen("a.in","r",stdin);
// freopen("a.out","w",stdout);
// printf("%dM\n",(sizeof(dp) >> 20));
cin>>n>>p>>k;
for(re int i=1;i<=p;++i)
{
edge[i].s=read(),edge[i].t=read(),edge[i].v=read();
}
int l=1,r=1000100,mid=0;
int ans=-1;
while(l<=r)
{
//cout<<dis[n]<<endl;
mid=l+r>>1;
if(P(mid))
ans=mid,r=mid-1;
else
l=mid+1;
}
cout<<ans;
return 0;
}