#include <queue>
#include <iostream>
#include <cstring>
using namespace std;
const int N = 1e4 + 10000;
const int M = 1e5 + 10 ;
int e[M] , ne[M] , h[N] , w[M] , idx ;
int dis[N] ;
bool st[M] ;
int k , n , p ;
typedef pair<int , int> Pair ;
void add(int a , int b , int c)
{
e[idx] = b , ne[idx] = h[a] , w[idx] = c , h[a] = idx ++ ;
}
void spfa()
{
queue<int> q ;
memset(dis , 0x3f , sizeof dis) ;
q.push(1) ;
dis[1] = 0;
st[1] = 1 ;
while(q.size())
{
int u = q.front() ;
q.pop() ;
st[u] = 0 ;
for(int i = h[u] ;i != -1 ;i = ne[i])
{
int j = e[i] ;
int maxn = max(dis[u] , w[i]) ;
if(dis[j] > maxn)
{
dis[j] = maxn;
if(!st[j])
{
st[j] = 1 ;
q.push(j) ;
}
}
}
}
}
int main()
{
int n , p , k ;
cin >> n >> p >> k ;
memset(h , -1 , sizeof h) ;
for(int i = 1 ;i <= p;i ++)
{
int a , b , c ;
scanf("%d%d%d" , &a , &b , &c) ;
add(a , b , c) , add(b , a , c) ;
for(int j = 1 ;j <= k;j ++)
{
add(a + n * j , b + n * j , c) ;
add(b + n * j , a + n * j , c) ;
add(a + n * (j - 1) , b + n * j , 0) ;
add(b + n * (j - 1) , a + n * j , 0) ;
}
}
for(int i = 1 ;i <= k ;i ++)
add(i * n , (i + 1) * n , 0) ;
spfa() ;
printf("%d\n" , (dis[(k + 1) * n] == 0x3f3f3f3f ? -1 : dis[(k + 1)* n] ) ) ;
return 0 ;
}
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
const int N = 2e5 + 10 ;
int e[N * 2] , ne[N * 2] , h[N * 2] , w[N * 2] ;
int dis[1100][1100] ;
int idx ;
bool st[1100] ;
int k ;
void add(int a , int b , int c)
{
e[++ idx] = b , ne[idx] = h[a], w[idx] = c , h[a] = idx ;
}
void spfa()
{
memset(dis , 0x3f , sizeof dis) ;
queue<int> q ;
q.push(1) ;
dis[1][0] = 0 ;
st[1] = true ;
while(q.size())
{
int u = q.front() ;q.pop() ;
st[u] = false ;
for(int i = h[u] ; i != -1 ;i = ne[i])
{
int v = e[i] ;
if(dis[v][0] > max(dis[u][0] , w[i]))
{
dis[v][0] = max(dis[u][0] , w[i]) ;
if(!st[v])
{
q.push(v) ;
st[v] = 1 ;
}
}
for(int p = 1 ;p <= k ;p ++)
{
if(dis[v][p] > min(dis[u][p - 1] , max(dis[u][p] , w[i])))
{
dis[v][p] = min(dis[u][p - 1] , max(dis[u][p] , w[i])) ;
if(!st[v])
{
q.push(v) ;
st[v] = 1;
}
}
}
}
}
}
int main()
{
int n , m ;
memset(h , -1 , sizeof h) ;
cin >> n >> m >> k ;
for(int i = 1 ;i <= m ;i ++)
{
int a , b , c ;
cin >> a >> b >> c ;
add(a , b , c) , add(b ,a , c) ;
}
spfa() ;
int res = 0x3f3f3f3f ;
for(int i = 0 ;i <= k ;i ++)
res = min(res , dis[n][i]) ;
cout << (res == 0x3f3f3f3f ? -1 : res) << endl ;
return 0 ;
}