1 #include<bits/stdc++.h>
2 using namespace std;
3 int n,m,k;
4 const int maxn=1e6+10;
5 const int maxm=9e6+10;
6 const int inf=0x3f3f3f3f;
7 struct Dijkstra
8 {
9 struct Edge
10 {
11 int next, to ,w;
12 } e[maxm];
13 int head[maxn],v[maxn],d[maxn],tol;
14 void add(int u, int v, int w)
15 {
16 tol++;
17 e[tol].to = v;
18 e[tol].next = head[u];
19 e[tol].w = w;
20 head[u] = tol;
21 }
22 priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > >q1;
23 int dijkstra(int s,int t)
24 {
25 memset(d,inf,sizeof(d));
26 memset(v,0,sizeof(v));
27 d[s] = 0;
28 q1.push(make_pair(0, s));
29 while (!q1.empty())
30 {
31 int x = q1.top().second;
32 q1.pop();
33 if (!v[x])
34 {
35 v[x] = 1;
36 for (register int i = head[x]; i; i = e[i].next)
37 {
38 int to=e[i].to,k=max(e[i].w,d[x]);
39 if (d[to]>k){
40 d[to]=k;
41 q1.push(make_pair(d[to], to));
42 }
43 }
44 }
45 }
46 return d[t];
47 }
48
49 void init()
50 {
51 memset(head, 0, sizeof(head));
52 tol = 0;
53 }
54 } H;
55
56
57 int main(){
58 scanf("%d%d%d",&n,&m,&k);
59 H.init();
60 for (int i=1;i<=m;i++){
61 int u,v,w;
62 scanf("%d%d%d",&u,&v,&w);
63 H.add(u,v,w);
64 H.add(v,u,w);
65 for (int j=1;j<=k;j++) {
66 H.add(u+n*(j-1), v + j * n, 0);
67 H.add(v+n*(j-1), u+ j * n, 0);
68 H.add(u+j*n,v+j*n,w);
69 H.add(v+j*n,u+j*n,w);
70 }
71 for (int i=1;i<=k;i++){
72 H.add(i*n,(i+1)*n,0);
73 }
74 }
75 int ans=H.dijkstra(1,n*(k+1));
76 if (ans==inf) printf("-1\n");else printf("%d\n",ans);
77 }