邻接表+弗洛伊德
#include <iostream>
#include <cstring>
#include <vector>
using namespace std;
#define INF 0x3f3f3f3f
struct node{
int next;
int lenth;
node(int next=-1, int lenth=-1):next(next), lenth(lenth){}
};
vector<vector<node>> mp; //105个维度的
bool vis[105];
int dis[105];
void dij(int start, int n){
memset(vis, false, sizeof(vis));
memset(dis, INF, sizeof(dis));
vis[start]=true;
for(int i=0; i<mp[1].size(); ++i){
dis[mp[1][i].next]= mp[1][i].lenth; //初始化,1到各个点的距离
}
int key=0;
for(int i=1; i<=n; ++i){ //轮次
int min=INF;
for(int j=1; j<=n; ++j){ //选出未遍历点中距离起点最近的
if(!vis[j] && dis[j]<min){
min=dis[j];
key=j;
}
}
vis[key]=true;
for(int j=1; j<=n; ++j){
int update=0;
for(int k=0; k<mp[key].size(); ++k){
update=mp[key][k].next;
if(!vis[update] && dis[key]+mp[key][k].lenth<dis[update]){ //更新没遍历的其他dis
dis[update]=dis[key]+mp[key][k].lenth;
}
}
}
}
}
int main(){
int m=0, n=0;
for(int i=0; i<105; ++i){
mp.push_back(vector<node>()); //向二维数组添加行
}
while(cin >> n>> m){
if(!m && !n)
break;
int a=0, b=0, c=0;
for(int i=0; i<n; ++i){ //初始化
mp[i].clear();
}
while(m--){
cin >> a >> b >> c;
mp[a].push_back(node(b,c));
mp[b].push_back(node(a,c));
}
dij(1, n);
cout << dis[n] << endl;
}
return 0;
}