#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 1e3 + 10, maxm = 2e5 + 10;
struct edge {
int x, y, z;
} a[maxm];
bool vis[maxn];
int n, p, k, l, r, mid, minn, temp, ans, dis[maxn], mp[maxn][maxn];
void Dijkstra(int u) {
vis[u] = true;
for (int i = 1; i <= n; i++) dis[i] = mp[u][i];
for (int k = 1; k + 1 <= n; k++) {
minn = 0x3f3f3f3f, temp = -1;
for (int i = 1; i <= n; i++) {
if (vis[i] || dis[i] >= minn) continue;
minn = dis[i];
temp = i;
}
if (~temp) {
vis[temp] = true;
for (int i = 1; i <= n; i++) {
if (vis[i] || mp[temp][i] == 0x3f3f3f3f) continue;
dis[i] = min(dis[i], mp[temp][i] + dis[temp]);
}
} else break;
}
return ;
}
bool check(int x) {
memset(vis, false, sizeof(vis));
memset(mp, 0x3f, sizeof(mp));
for (int i = 1; i <= n; i++) mp[i][i] = 0;
for (int i = 1; i <= p; i++) mp[a[i].x][a[i].y] = a[i].z > x;
Dijkstra(1);
return dis[n] <= k;
}
int main() {
scanf("%d %d %d", &n, &p, &k);
for (int i = 1; i <= p; i++) scanf("%d %d %d", &a[i].x, &a[i].y, &a[i].z);
r = 1e6;
while (l <= r) {
mid = l + r >> 1;
if (check(mid)) {
ans = mid;
r = mid - 1;
} else l = mid + 1;
}
printf("%d\n", ans);
return 0;
}