#include<bits/stdc++.h>
#define maxn 100005
#define int long long
using namespace std;
int head[maxn];
struct node {
int to,next,w;
bool operator < (const node& hhh) const{ return w>hhh.w; }
} a[maxn];
int cnt;
void add(int u,int v,int w) {
a[++cnt].to=v;
a[cnt].next=head[u];
a[cnt].w=w;
head[u]=cnt;
}
int a1[100001];
int n,m;
int mmin=1e12;
int mminc;
bool flag=0;
bool vis[100001];
int f[maxn];
int ans;
int dis[maxn];
int pos[maxn];
priority_queue<pair<long long,int> > q;
void dji(int p){
memset(dis,0x3f,sizeof(dis));
dis[p]=0;
q.push(make_pair(0,p));
while(!q.empty()){
int s=q.top().second;
q.pop();
if(vis[s]){
continue;
}
vis[s]=1;
for(int i=head[s];i;i=a[i].next){
int k=a[i].to;
if(dis[k]>dis[s]+a[i].w){
dis[k]=dis[s]+a[i].w;
q.push(make_pair(-dis[k],k));
pos[k]=s;
}
}
}
}
signed main() {
cin>>n>>m;
for(int i=1; i<=m; i++) {
int u,v,w;
cin>>u>>v>>w;
add(u,v,w);
add(v,u,w);
}
dji(1);
int now=1;
if(dis[n]==0x3f){
cout<<"-1"<<endl;
exit(0);
}
for(int i=n;i;i=pos[i]){
a1[now++]=i;
if(i==1){
flag=1;
}
}
if(flag==0)
cout<<"-1"<<endl;
else
for(int i=now-1;i>=1;i--){
cout<<a1[i]<<" ";
}
return 0;
}