#include<bits/stdc++.h>
using namespace std;
const long long MaxN = 2e5 + 5, INF= 1e18+5;
long long n,m, d[MaxN], p[MaxN];
vector<pair<long long, long long>> vt[MaxN];
vector<long long> ans;
void dijikstra(long long v, long long d[])
{
    priority_queue<pair<long long, long long>, vector<pair<long long, long long>>, greater<pair<long long, long long>>> pq;
    pq.push({0,1});
    while(!pq.empty())
    {
        long long u = pq.top().second;
        long long du= pq.top().first;
        pq.pop();
        if(du!=d[u]) continue;
        for (auto x : vt[u])
        {
            long long v = x.first;
            long long weight_v = x.second;
            if(d[v]>d[u]+weight_v)
            {
                d[v]=d[u]+weight_v;
                pq.push({d[v],v});
                p[v]=u;
            }
        }
    }
}
void input()
{
    cin >> n >> m;
    for (long long i=1; i<=m; i++)
    {
        long long u,v,w;
        cin >> u >> v >> w;
        vt[u].push_back ({v,w});
        vt[v].push_back({u,w});
    }
}
void output()
{
    memset(d,0x3f, sizeof(d));
    d[1]=0;
    dijikstra(1,d);
    if(d[n]>INF)
    {
        cout << -1;
        return;
    }
    long long node = n;
    ans.push_back(node);
    while(node!=1)
    {
        node = p[node];
        ans.push_back(node);
    }
    reverse(ans.begin(),ans.end());
    cout << d[n] << "\n";
    for (long long x : ans)
    {
        cout << x << " ";
    }
}
int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    input();
    output();
}
