#include typedef struct List { struct List *next; int v, cost; } list; int main() { int i, N, M, K, u, w, c; list *adj[200001] = {}, e[400001], *p; scanf("%d %d %d", &N, &M, &K); for (i = 0; i < M; i++) { scanf("%d %d %d", &u, &w, &c); e[i*2].v = w; e[i*2+1].v = u; e[i*2].cost = c; e[i*2+1].cost = c; e[i*2].next = adj[u]; e[i*2+1].next = adj[w]; adj[u] = &(e[i*2]); adj[w] = &(e[i*2+1]); } const int sup = 1 << 20; int l = 0, r = 200000, m, dist[200001], q[400001][2], head, tail; while (l < r) { m = (l + r) / 2; for (u = 2, dist[1] = 0; u <= N; u++) dist[u] = sup; head = N; tail = N; q[tail][0] = 1; q[tail++][1] = 0; for (; head < tail; head++) { u = q[head][0]; if (q[head][1] != dist[u]) continue; for (p = adj[u]; p != NULL; p = p->next) { w = p->v; if (p->cost <= m && dist[w] > dist[u]) { dist[w] = dist[u]; q[head][0] = w; q[head--][1] = dist[w]; } else if (p->cost > m && dist[w] > dist[u] + 1) { dist[w] = dist[u] + 1; q[tail][0] = w; q[tail++][1] = dist[w]; } } } if (dist[N] >= K) l = m + 1; else r = m; } printf("%d\n", l); fflush(stdout); return 0; }