#include<stdio.h>
#include<vector>//适用于点数不超过200的题。点数多容易炸,不建议使用
using namespace std;
const int inf=0xffffff;
int d[1005][1005],m,n;
void floyd()
{
int k,i,j;
for(k=1;k<=n;k++)//如果存在顶点k,使得以k作为中介点时顶点i,顶点j的当前距离缩短,则使用顶点k作为顶点i和顶点j的中介点
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(d[i][k]!=inf&&d[k][j]!=inf&&d[i][k]+d[k][j]<d[i][j])
d[i][j]=d[i][k]+d[k][j];
}
int main()
{
int u,v,f,i;
while(~scanf("%d%d",&n,&m)&&(n!=0&&m!=0))
{
fill(d[0],d[0]+1005*1005,inf);
for(i=0;i<=n;i++)
d[i][i]=0;
for(i=1;i<=m;i++)
{
scanf("%d%d%d",&u,&v,&f);
d[u][v]=f;
d[v][u]=f;
}
floyd();
printf("%d\n",d[1][n]);
}
}