//Dijkstra+heap版本 #include<iostream> #include<queue> using namespace std; #define maxm 20005 #define maxn 105 #define inf 0x3f3f3f3f struct edges { int u, c, next; }e[maxm]; struct node { int u, c; node (int u, int c) : u(u), c(c) {} friend bool operator < (node a,node b){ return a.c>b.c; } }; int dist[maxn], p[maxn]; bool used[maxn]; int N, M, idx; priority_queue<node> q; void init() { idx = 0; memset(p, 0xff, sizeof(p)); } void addedge(int u, int v, int c) { e[idx].u = v; e[idx].c = c; e[idx].next = p[u]; p[u] = idx++; } void dijkstra(int s, int d) { int t, u, w; node tmp(s, 0); while(!q.empty()) q.pop(); for(int i=0; i<N; i++) dist[i] = inf; memset(used, false, sizeof(used)); dist[s]=0; q.push(tmp); while(!q.empty()) { tmp = q.top(); q.pop(); t = tmp.u; if(used[t]) continue; else used[t] = true; if(t==d) return; for(int i=p[t];i!=-1;i=e[i].next) { u = e[i].u; w = e[i].c; //if(used[u])continue; if(dist[t] + w < dist[u]) { dist[u] = dist[t] + w; q.push(node(u, dist[u])); } } } } int main() { int a,b,c; while(scanf("%d%d",&N,&M)&&N) { init(); for(int i=0;i<M;i++) { scanf("%d%d%d",&a,&b,&c); a--;b--; addedge(a,b,c); addedge(b,a,c); } dijkstra(0,N-1); printf("%d/n",dist[N-1]); } // system("pause"); return 0; }