// Source: https://usaco.guide/general/io
#include <bits/stdc++.h>
#include <queue>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n,m;cin>>n>>m;
vector<vector<pair<int,int>>> v(n);
for(int i = 0;i<m;i++){
int a,b,c;
cin>>a>>b>>c;
v[a].push_back({b,c});
v[b].push_back({a,c});
}
vector<int> disS(n,INT_MAX),disE(n,INT_MAX),os(n,-1);
priority_queue<pair<int, int>> q;
disS[0]=0;
q.push({0,0});
while(!q.empty()){
auto[c,a]=q.top();
q.pop();
c*=-1;
if(c>disS[a])continue;
for(auto u:v[a]){
int b=u.first,w=u.second;
if(disS[b]>disS[a]+w){
disS[b]=disS[a]+w;
q.push({-disS[b],b});
os[b]=a;
}
}
}
vector<bool> shortestPath(n);
int curr = n-1;
while (curr!=-1) {
shortestPath[curr]=true;
curr=os[curr];
}
q.push({0,n-1});
disE[n-1]=0;
while(!q.empty()){
auto[c,a]=q.top();
q.pop();
c*=-1;
if(c>disE[a])continue;
for(auto u:v[a]){
int b=u.first,w=u.second;
if(disE[b]>disE[a]+w){
disE[b]=disE[a]+w;
q.push({-disE[b],b});
os[b]=a;
}
}
}
int ans=INT_MAX;
for(int i = 0;i<n;i++){
for(auto u : v[i]){
int a=i,b=u.first,c=u.second;
if(disS[a]+disE[b]+c>disS[n-1]){
if(disS[a]+disE[b]+c-disS[n-1]+1<c&&!(shortestPath[a]&&shortestPath[b]&&disS[n-1]==c+disS[a]+disE[b])){//cout<<a<<' '<<b<<endl;
ans=min(ans,disS[a]+disE[b]+c-disS[n-1]+1);
}
}
if(disS[b]+disE[a]+c>disS[n-1]){
if(disS[b]+disE[a]+c-disS[n-1]+1<c&&!(shortestPath[a]&&shortestPath[b]&&disS[n-1]==c+disE[a]+disS[b])){//cout<<a<<' '<<b<<endl;
ans=min(ans,disS[b]+disE[a]+c-disS[n-1]+1);
}
}
}
}cout<<(ans==INT_MAX?-1:ans)<<endl;
}