//如果一个点入队次数大于等于节点数则存在负环,return FALSE
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
const int inf = 0x3fffffff;
int d[10005];
int vis[10005];
int num[10005];
struct cmp
{
bool operator()(int x,int y)
{
return x>y;
}
};
struct node{
int v,w;
};
vector<node>a[10005];
int n,m;
bool spfa(int s0)
{
priority_queue<int,vector<int>,cmp> q;
memset(vis,0,sizeof(vis));
memset(num,0,sizeof(num));
fill(d,d+10005,inf);
d[s0] = 0;
q.push(s0);
vis[s0] = true;
num[s0]++;
while(!q.empty())
{
int p = q.top();
q.pop();
for(int i=0;i<a[p].size();i++)
{
int v=a[p][i].v;
if(d[p]+a[p][i].w<d[v])
{
d[v] = d[p]+a[p][i].w;
if(!vis[v])
{
q.push(v);
num[v]++;
if(num[v]>=n)//存在负环
{
return false;
}
vis[v]=true;
}
}
}
vis[p]=0;
}
return true;
}
int main()
{
int k,i,u,v,w;
//freopen("in.txt","r",stdin);
while(~scanf("%d%d",&n,&m))
{
for(i=0;i<=1005;i++)
{
a[i].clear();
}
if(n==0)
break;
for(i=0;i<m;i++)
{
node t;
scanf("%d%d%d",&u,&v,&w);
t.v=v;
t.w=w;
a[u].push_back(t);
t.v=u;
a[v].push_back(t);
}
bool c=spfa(1);
printf("%d\n",d[n]);
}
}