#include <bits/stdc++.h>
using namespace std;
const int maxn = 100003;
pair<int, int> mat[maxn];
bool comp(const pair<int, int>& a, const pair<int, int>& b) {
  if (a.second == b.second)
    return a.first < b.first;
  else
    return a.second < b.second;
}
int main() {
  int n, m;
  cin >> n >> m;
  for (int i = 0; i < m; i++) {
    cin >> mat[i].first >> mat[i].second;
  }
  sort(mat, mat + m, comp);
  vector<int> vy;
  vy.push_back(1);
  vy.push_back(2);
  vy.push_back(n);
  vy.push_back(n - 1);
  for (int i = 0; i < m; i++) {
    for (int j = -1; j <= 1; j++) {
      vy.push_back(mat[i].second + j);
    }
  }
  int vsz = 0;
  for (int i = 0; i < vy.size(); i++) {
    if (1 <= vy[i] && vy[i] <= n) {
      vy[vsz] = vy[i];
      vsz++;
    }
  }
  vy.resize(vsz);
  sort(vy.begin(), vy.end());
  vy.erase(unique(vy.begin(), vy.end()), vy.end());
  set<pair<int, int> > s;
  s.insert(pair<int, int>(1, 1));
  int sz = 0;
  for (int i = 0; i < vy.size(); i++) {
    int cy = vy[i];
    vector<int> vcur;
    while (sz < m && mat[sz].second == cy) {
      vcur.push_back(mat[sz].first);
      sz++;
    }
    vcur.push_back(n + 1);
    int nxt = 0;
    for (int j = 0; j < vcur.size(); j++) {
      int mx = vcur[j];
      while (true) {
        set<pair<int, int> >::iterator itr =
            s.lower_bound(pair<int, int>(nxt + 1, -1));
        if (itr == s.end()) break;
        if ((*itr).first > vcur[j]) break;
        mx = min(mx, (*itr).first);
        if ((*itr).second > vcur[j]) {
          s.insert(pair<int, int>(vcur[j] + 1, (*itr).second));
        }
        s.erase(itr);
      }
      if (mx < vcur[j]) {
        s.insert(pair<int, int>(mx, vcur[j] - 1));
      }
      nxt = mx;
    }
  }
  if (!s.empty() && (*s.rbegin()).second >= n) {
    cout << n + n - 2;
  } else {
    cout << -1;
  }
}
