#include<iostream>
#include<cstring>
using namespace std;
const int INF=99999999;
const int MAX=205;
int map[MAX][MAX];
int dis[MAX];
int vis[MAX];
int m,n;
void Init(){
int i,j;
int u,v,w;
for(i=0; i<=n; i++){
for(j=0; j<=n; j++)
map[i][j] = INF;
map[i][i] = 0;
}
memset(vis,0,sizeof(vis));
for(i=1; i<=m; i++){
cin>>u>>v>>w;
if(w < map[u][v])
map[u][v] = map[v][u] = w;
}
}
void Dijkstra(int u){
int i,j;
int now,min;
for(i=0; i<n; i++){
dis[i] = map[u][i];
}
vis[u] = 1;
for(i=1; i<n; i++){
min=INF;
for(j=0; j<n; j++){
if(!vis[j] && dis[j]<min){
min = dis[j];
now = j;
}
}
vis[now] = 1;
for(j=0; j<=n; j++)
if(!vis[j] && dis[now]+map[now][j]<dis[j]){
dis[j] = dis[now]+map[now][j];
}
}
cout<<dis[n-1]<<endl;
}
int main(){
while( cin>>n>>m ){
Init();
Dijkstra(0);
}
return 0;
}
#include<cstring>
using namespace std;
const int INF=99999999;
const int MAX=205;
int map[MAX][MAX];
int dis[MAX];
int vis[MAX];
int m,n;
void Init(){
int i,j;
int u,v,w;
for(i=0; i<=n; i++){
for(j=0; j<=n; j++)
map[i][j] = INF;
map[i][i] = 0;
}
memset(vis,0,sizeof(vis));
for(i=1; i<=m; i++){
cin>>u>>v>>w;
if(w < map[u][v])
map[u][v] = map[v][u] = w;
}
}
void Dijkstra(int u){
int i,j;
int now,min;
for(i=0; i<n; i++){
dis[i] = map[u][i];
}
vis[u] = 1;
for(i=1; i<n; i++){
min=INF;
for(j=0; j<n; j++){
if(!vis[j] && dis[j]<min){
min = dis[j];
now = j;
}
}
vis[now] = 1;
for(j=0; j<=n; j++)
if(!vis[j] && dis[now]+map[now][j]<dis[j]){
dis[j] = dis[now]+map[now][j];
}
}
cout<<dis[n-1]<<endl;
}
int main(){
while( cin>>n>>m ){
Init();
Dijkstra(0);
}
return 0;
}