#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int n,m,hash[1010],dis[1010],map[1010][1010];
const int inf=0x7fffffff;
void dijstra()
{
dis[1]=0;
for(int i=1;i<=n;i++)
{
int t=inf,pos;
for(int j=1;j<=n;j++)//找出当前未标记的最小顶点
{
if(hash[j]==0)
{
if(dis[j]<t)
{
t=dis[j];
pos=j;
}
}
}
hash[pos]=1;
if(pos==n) break;//路径压缩
for(int j=1;j<=n;j++)//不断更改值使之最小
{
if(hash[j]==0)
{
if(map[pos][j]!=inf&&dis[pos]+map[pos][j]<dis[j])
{
dis[j]=dis[pos]+map[pos][j];
}
}
}
}
}
int main()
{
int a,b,val;
while(scanf("%d%d",&n,&m)!=EOF)
{
for(int i=1;i<=n;i++)//初始化
{
hash[i]=0;
dis[i]=inf;
for(int j=1;j<=n;j++)
{
map[i][j]=inf;
}
}
for(int i=1;i<=m;i++)//输入边对应的顶点及权值
{
scanf("%d%d%d",&a,&b,&val);
if(val<map[a][b]&&a!=b)//注意此处不能丢,因为有可能输入相同的边对应于不同的权值,找最小的输入。
{
map[a][b]=map[b][a]=val;
}
}
dijstra();
printf("%d\n",dis[n]);
}
system("pause");
return 0;
}