#include<bits/stdc++.h>
using namespace std;
const long long MaxN = 2e5 + 5,MaxK=2, INF= 1e18;
long long n,m, d[MaxN][MaxK];
vector<pair<long long, long long>> vt[MaxN];

void dijikstra()
{
    priority_queue<tuple<long long, long long, long long>,
                   vector<tuple<long long, long long, long long>>,
                   greater<tuple<long long, long long, long long>>> pq;

    pq.push({0,1,0});

    while(!pq.empty())
    {
        long long du=get<0>(pq.top());
        long long u=get<1>(pq.top());
        long long state=get<2>(pq.top());
        pq.pop();

        if(du!=d[u][state]) continue;

        for(auto x:vt[u])
        {
            long long v=x.first;
            long long weight_v=x.second;
            long long nd=du+weight_v;

            if(state==0)
            {
                if(nd<d[v][0])
                {
                    d[v][1]=d[v][0];
                    d[v][0]=nd;

                    pq.push({d[v][0],v,0});

                    if(d[v][1]!=INF)
                        pq.push({d[v][1],v,1});
                }
                else if(d[v][0]<nd && nd<d[v][1])
                {
                    d[v][1]=nd;
                    pq.push({d[v][1],v,1});
                }
            }

            if(state==1)
            {
                if(d[v][0]<nd && nd<d[v][1])
                {
                    d[v][1]=nd;
                    pq.push({d[v][1],v,1});
                }
            }
        }
    }
}

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()
{
    for(long long i=1;i<=n;i++)
    {
        for(long long j=0;j<=1;j++)
        {
            d[i][j]=INF;
        }
    }

    d[1][0]=0;

    dijikstra();

    if(d[n][1]==INF)
    {
        cout<<-1;
        return;
    }

    cout<<d[n][1];
}

int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);

    input();
    output();
}