#include <bits/stdc++.h>
#define ll long long
using namespace std;
struct Edge {
int v;
ll w;
};
struct Point {
int p;
ll w;
};
const int N = 2e5 + 5;
int n, m, s, pre[N];
bool vis[N], flag = false;
ll dis[N];
vector <Edge> e[N];
stack <int> sta;
struct cmp {
bool operator()(Point &a, Point &b) {
return a.w > b.w;
}
};
priority_queue <Point, vector<Point>, cmp> q;
void add (int u, int v, int w) {
e[u].push_back((Edge){v, w});
e[v].push_back((Edge){u, w});
}
void Dijkstra (int n, int s) {
memset(vis, false, sizeof(vis));
memset(dis, 0x3f, sizeof(dis));
dis[s] = 0;
pre[s] = 0;
q.push((Point){s, 0});
int T = n;
while (T--) {
Point head = q.top();
while (vis[head.p]) {
q.pop();
head = q.top();
}
int now = head.p;
vis[now] = true;
for (int i = 0; i < (int)(e[now].size()); i++) {
int v = e[now][i].v;
ll w = e[now][i].w;
if (dis[v] > dis[now] + w) {
dis[v] = dis[now] + w;
q.push((Point){v, dis[v]});
pre[v] = now;
}
}
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
cin >> n >> m;
for (int i = 1; i <= m; i++) {
int u, v;
ll w;
cin >> u >> v >> w;
add(u, v, w);
}
Dijkstra(n, 1);
for (int i = n; i; i = pre[i]) {
if (i == 1) {
flag = true;
}
sta.push(i);
}
if (!flag) {
cout << -1;
return 0;
}
while (!sta.empty()) {
cout << sta.top() << ' ';
sta.pop();
}
return 0;
}