#include <iostream>
#include <set>
#include <algorithm>
#include <math.h>
#include <vector>
#include <queue>
#include <map>
#include <unordered_map>
#include <unordered_set>
#include <iterator>
// #include<bits/stdc++.h>
using namespace std;
#define forn(i, a, n) for (int i = a; i < n; i++)
#define MAXN 1000000
#define MOD 1000000007
#define INT_MAX 1e12
#define int long long
#define tc \
int t; \
cin >> t; \
while (t--)
#define TC size(arr) / size(arr[0])
#define Radhe ios::sync_with_stdio(false);
#define Krishna cin.tie(NULL);
void solve()
{
int n, m;
cin >> n >> m;
vector<vector<pair<int, int>>> adj(n);
map<pair<int, int>, int> mp;
vector<int> par(n, -1);
for (int i = 0; i < m; i++)
{
int u, v, w;
cin >> u >> v >> w;
if (u == v)
{
continue;
}
if (v < u)
{
swap(u, v);
}
u--, v--;
if (mp.count({u, v}))
{
mp[{u, v}] = min(mp[{u, v}], w);
}
else
{
mp[{u, v}] = w;
}
}
for (auto i = mp.begin(); i != mp.end(); i++)
{ auto x=*i;
adj[x.first.first].push_back({x.first.second,x.second});
adj[x.first.second].push_back({x.first.first,x.second});
}
priority_queue<pair<int, pair<int, int>>, vector<pair<int, pair<int, int>>>, greater<pair<int, pair<int, int>>>> pq;
vector<int> dist(n, INT_MAX);
dist[0] = 0;
pq.push({0, {0, -1}});
while (!pq.empty())
{
int u = pq.top().second.first;
if(pq.top().first>dist[u])
{
pq.pop();
continue;
}
par[u] = pq.top().second.second;
pq.pop();
for (auto it : adj[u])
{
int v = it.first;
int weight = it.second;
if (dist[u] == INT_MAX)
{
continue;
}
if (dist[v] > dist[u] + weight)
{
dist[v] = dist[u] + weight;
pq.push({dist[v], {v, u}});
}
}
}
if(dist[n-1]==INT_MAX)
{
cout<<-1<<endl;
return;
}
vector<int> ans;
int i = n - 1;
while (i != -1)
{
ans.push_back(i + 1);
i = par[i];
}
for(int i=ans.size()-1;i>0;i--)
{
cout<<ans[i]<<" ";
}
cout<<ans[0]<<endl;
}
int32_t main()
{
Radhe Krishna
{
solve();
}
return 0;
}