![]()
1 #include <iostream>
2 #include <queue>
3 using namespace std;
4 typedef long long ll;
5
6 const int MAXN=100100;
7 const int MAXM=500100;
8 const int INF=0x3f3f3f3f;
9
10 struct Edge
11 {
12 int to,next;
13 int w;
14 }e[MAXM*80];
15 int head[MAXM*80],cnt=0;
16 void addEdge(int x,int y,int z)
17 {
18 cnt++;
19 e[cnt].to=y;
20 e[cnt].next=head[x];
21 e[cnt].w=z;
22 head[x]=cnt;
23 return;
24 }
25
26 int n,m,k;
27 ll t[MAXN*80];
28 bool vis[MAXN*80];
29
30 void Dijkstra()
31 {
32 for (int i=1;i<=(k+1)*n;i++)
33 {
34 t[i]=INF;
35 vis[i]=false;
36 }
37 t[1]=0;
38
39 priority_queue< pair<int,int> >pq;
40 pq.push(make_pair(0,1));
41
42 while (!pq.empty())
43 {
44 int cur=pq.top().second;
45 pq.pop();
46
47 if (vis[cur]) continue;
48 vis[cur]=true;
49
50 for (int i=head[cur];i!=0;i=e[i].next)
51 {
52 if (t[e[i].to]>t[cur]+e[i].w)
53 {
54 t[e[i].to]=t[cur]+e[i].w;
55 pq.push(make_pair(-t[e[i].to],e[i].to));
56 }
57 }
58 }
59 return;
60 }
61
62 int main()
63 {
64 cin>>n>>m>>k;
65
66 int u,v,w;
67 for (int i=1;i<=m;i++)
68 {
69 cin>>u>>v>>w;
70 for (int i=0;i<=k;i++)
71 {
72 addEdge(u+i*n,v+i*n,w);
73 addEdge(v+i*n,u+i*n,w);
74 }
75 for (int i=0;i<k;i++)
76 {
77 addEdge(u+i*n,v+(i+1)*n,0);
78 addEdge(v+i*n,u+(i+1)*n,0);
79 }
80 }
81
82 Dijkstra();
83
84 ll ans=INF;
85 for (int i=1;i<=(k+1);i++)
86 {
87 ans=min(ans,t[i*n]);
88 }
89 cout<<ans<<endl;
90
91 return 0;
92 }