1 #include<cstdio>
2 #include<iostream>
3 #include<cstring>
4 #include<queue>
5
6 #define N 1000000+20
7
8 using namespace std;
9
10 int n,m,k,num,head[N];
11 bool inq[N];
12 int dis[N];
13 struct node
14 {
15 int u,v,t,pre;
16 }a[N];
17
18 void add_tree(int,int,int);
19 void SPFA(int);
20 void init();
21
22 int main()
23 {
24 init();
25 int l=0,r=N,ans=-1;
26 while(l<=r)
27 {
28 memset(inq,0,sizeof(inq));
29 memset(dis,127/3,sizeof(dis));
30 int mid=(l+r)/2;
31 SPFA(mid);
32 if(dis[n]<=k)
33 {
34 ans=mid;
35 r=mid-1;
36 }
37 else
38 l=mid+1;
39 }
40 printf("%d",ans);
41 return 0;
42 }
43
44 void add_tree(int from,int to,int ll)
45 {
46 num++;
47 a[num].u=from;
48 a[num].v=to;
49 a[num].t=ll;
50 a[num].pre=head[from];
51 head[from]=num;
52 }
53
54 void SPFA(int s)
55 {
56 queue<int>q;
57 dis[1]=0;
58 inq[1]=0;
59 q.push(1);
60 while(!q.empty())
61 {
62 int p=q.front();
63 q.pop();
64 inq[p]=0;
65 for(int i=head[p];i;i=a[i].pre)
66 {
67 int si;
68 if(a[i].t<=s)
69 si=0;
70 else
71 si=1;
72 if(dis[a[i].v]>dis[p]+si)
73 {
74 dis[a[i].v]=dis[p]+si;
75 if(inq[a[i].v]==0)
76 {
77 q.push(a[i].v);
78 inq[a[i].v]=1;
79 }
80 }
81 }
82
83 }
84 }
85
86 void init()
87 {
88 scanf("%d%d%d",&n,&m,&k);
89 for(int i=1;i<=m;i++)
90 {
91 int x,y,z;
92 scanf("%d%d%d",&x,&y,&z);
93 add_tree(x,y,z);
94 add_tree(y,x,z);
95 }
96 }