#include <bits/stdc++.h>
using namespace std;
const int N=1e3+10, M=1e4+10;
int n, m, k, val[M], dis[N];
bool vis[N];
struct edge{
int to, w, t;
};
vector<edge> g[N];
int bfs()
{
memset(vis, 0, sizeof(vis));
deque <int> q;
memset(dis, 0x3f, sizeof(dis));
q.push_front(1); dis[1]=0, vis[1]=1;
while(q.size())
{
int u=q.front(); q.pop_front();
for(int i=1; i<g[u].size(); i++)
{
int v=g[u][i].to;
if(!vis[v])
{
vis[v]=1;
dis[v]=dis[u]+g[u][i].t;
if(g[u][i].t)
{
q.push_back(v);
}else{
q.push_front(v);
}
}
}
}
return dis[n];
}
bool check(int x)
{
for(int u=1; u<=n; u++)
{
for(int i=0; i<g[u].size(); i++)
{
if(g[u][i].w>val[x]) g[u][i].t=1;
else g[u][i].t=0;
}
}
return bfs()<=k;
}
int main()
{
scanf("%d%d%d", &n, &m, &k);
for(int i=1; i<=m; i++)
{
int u, v, w;
scanf("%d%d%d", &u, &v, &w);
g[u].push_back((edge){v, w});
g[v].push_back((edge){u, w});
val[i]=w;
}
sort(val+1, val+m+1);
int l=1, r=m;
while(l<r)
{
int mid=(l+r)/2;
if(check(mid))
{
r=mid;
}else{
l=mid+1;
}
}
if(check(l))
{
printf("%d", val[l]);
}else{
puts("-1");
}
return 0;
}