1 /*
2 Dijkstra的算法思想:
3 在所有没有访问过的结点中选出dis(s,x)值最小的x
4 对从x出发的所有边(x,y),更新
5 dis(s,y)=min(dis(s,y),dis(s,x)+dis(x,y))
6 */
7 #include <iostream>
8 #include <cstdio>
9 #include <queue>
10 #include <vector>
11 using namespace std;
12 const int Ni = 10000;
13 const int INF = 1<<27;
14 struct node{
15 int x,d;
16 node(){}
17 node(int a,int b){x=a;d=b;}
18 bool operator < (const node & a) const
19 {
20 if(d==a.d) return x<a.x;
21 else return d > a.d;
22 }
23 };
24 vector<node> eg[Ni];
25 int dis[Ni],n;
26 void Dijkstra(int s)
27 {
28 int i;
29 for(i=0;i<=n;i++) dis[i]=INF;
30 dis[s]=0;
31 //用优先队列优化
32 priority_queue<node> q;
33 q.push(node(s,dis[s]));
34 while(!q.empty())
35 {
36 node x=q.top();q.pop();
37 for(i=0;i<eg[x.x].size();i++)
38 {
39 node y=eg[x.x][i];
40 if(dis[y.x]>x.d+y.d)
41 {
42 dis[y.x]=x.d+y.d;
43 q.push(node(y.x,dis[y.x]));
44 }
45 }
46 }
47 }
48 int main()
49 {
50 int a,b,d,m;
51 while(scanf("%d%d",&n,&m),n+m)
52 {
53 for(int i=0;i<=n;i++) eg[i].clear();
54 while(m--)
55 {
56 scanf("%d%d%d",&a,&b,&d);
57 eg[a].push_back(node(b,d));
58 eg[b].push_back(node(a,d));
59 }
60 Dijkstra(1);
61 printf("%d\n",dis[n]);
62 }
63 return 0;
64 }
65 /*
66 6 6
67 1 2 2
68 3 2 4
69 1 4 5
70 2 5 2
71 3 6 3
72 5 6 3
73 */