#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#define ll long long
using namespace std;
const ll MAXN = 1000005;
const ll MAXM = 1000005;
const ll inf = 2147483647;
ll n,m,S,T,dis[MAXN],head[MAXN],las[MAXN],ans[MAXN],Cnt,cnt,x,y,z,t;
ll to[MAXM],nxt[MAXM],val[MAXM];
bool vis[MAXN];
struct Node{
ll id,w;
friend bool operator<(const Node A,const Node B){
return A.w>B.w;
}
};
inline void add(ll bg,ll ed,ll w){
to[++cnt]=ed;
nxt[cnt]=head[bg];
head[bg]=cnt;
val[cnt]=w;
}
priority_queue<Node> Q;
void dijkstra(){
for(ll i=1;i<=n;i++)
dis[i]=inf;
Node now;
now.id=S;
now.w=0;
dis[S]=0;
ll p,ww;
Q.push(now);
while(!Q.empty())
{
Node x=Q.top();
Q.pop();
p=x.id;
ww=x.w;
if(vis[p] || dis[p]!=ww)
continue;
vis[p]=1;
ll u;
for(register ll i=head[p];i;i=nxt[i])
{
u=to[i];
if(dis[p]+val[i]<dis[u])
{
las[u]=p;
dis[u]=dis[p]+val[i];
now.id=u;
now.w=dis[u];
Q.push(now);
}
}
}
}
int main(){
S=1;
cin>>n>>m;
for(ll i=1;i<=m;i++){
cin>>x>>y>>z;
add(x,y,z);
add(y,x,z);
}
dijkstra();
if(dis[n]==inf)
{
cout<<-1;
return 0;
}
ans[++Cnt]=n;
while(n!=1)
n=las[n],ans[++Cnt]=n;
for(int i=Cnt;i>=1;i--)
cout<<ans[i]<<" ";
return 0;
}