#code:
#include<iostream>
#include<queue>
#include<cstring>
#define N 1000009
using namespace std;
typedef pair<long long ,long long> PII;
int h[N] , e[N] , ne[N] , idx;
long long dist[N] , w[N];
long long Prev[N] , _prev[N] , _idx;
int n , m , vis[N];
void add(int u , int v , int val){
w[idx] = val;
e[idx] = v;
ne[idx] = h[u];
h[u] = idx++;
}
int _scanf(){
int x = 0 , op = 1;
char f = getchar();
while(f < '0' || f > '9')
if(f == '-') op = -1 , f = getchar();
while(f >= '0' && f <= '9')
x = (x << 3) + (x << 1) + f - 48 , f = getchar();
return x * op;
}
void dijkstra(){
memset(dist , 0x3f3f , sizeof dist);
dist[1] = 0;
priority_queue<PII , vector<PII> , greater<PII> > heap;
heap.push({0 , 1});
_prev[_idx] = 1;
while(heap.size()){
PII k = heap.top();
heap.pop();
int ver = k.second;
int distance = k.first;
if(vis[ver]) continue;
vis[ver] = 1;
for(int i = h[ver];i != -1;i = ne[i]){
if(dist[e[i]] > distance + w[i]){
dist[e[i]] = distance + w[i];
heap.push({dist[e[i]] , e[i]});
Prev[e[i]] = ver;
}
}
}
}
int main(){
memset(h , -1 , sizeof h);
n = _scanf();
m = _scanf();
while(m--){
int u , v , val;
u = _scanf();
v = _scanf();
val = _scanf();
add(u , v , val);
add(v , u , val);
}
dijkstra();
bool st = false;
for(int i = n;i != -1;i = Prev[i]){
_prev[_idx++] = i;
if(i == 1){
st = true;
break;
}
}
if(!st)
puts("-1");
else
for(int i = _idx - 1;i >= 0;i--)
cout << _prev[i] << " ";
return 0;
}