#include <bits/stdc++.h>
using namespace std;
set<int> colunas;
set<pair<int, int> > celulas;
vector<pair<int, int> > cells;
int n;
bool canGet(set<int> &celulas_livres, set<int> &celulas_bloqueadas,
            set<int> &bloq_now, int now_col, int now_cel) {
  if (now_cel < 1 || now_cel > n) return false;
  if (colunas.find(now_col - 1) != colunas.end()) {
    set<int>::iterator it_livre = celulas_livres.upper_bound(now_cel);
    set<int>::iterator it_bloq = celulas_bloqueadas.upper_bound(now_cel);
    if (it_livre == celulas_livres.begin()) return false;
    it_livre--;
    it_bloq--;
    if (*it_livre > *it_bloq) return true;
    set<int>::iterator it_bloq_now = bloq_now.upper_bound(now_cel);
    it_bloq_now--;
    if (*it_livre > *it_bloq_now) return true;
    return false;
  }
  set<int>::iterator it_livre = celulas_livres.upper_bound(now_cel);
  if (it_livre != celulas_livres.begin()) return true;
  return false;
}
bool canReach() {
  int last_high = 1;
  set<int> livres, bloqueadas;
  for (int i = 0; i < cells.size();) {
    int ini = i;
    while (i < cells.size() && cells[i].first == cells[ini].first) i++;
    int fim = i - 1;
    set<int> now_livres, now_bloqueadas;
    if (cells[ini].first == 1) {
      for (int j = ini; j <= fim; j++) {
        if (cells[j].second <= n) now_bloqueadas.insert(cells[j].second);
      }
      for (int j = 1; j <= 100000; j++) {
        if (celulas.find(make_pair(j, 1)) != celulas.end()) break;
        now_livres.insert(j);
      }
    } else {
      for (int j = ini; j <= fim; j++)
        if (cells[j].second <= n) now_bloqueadas.insert(cells[j].second);
      for (int j = ini; j <= fim; j++) {
        int ant_x = cells[j].second - 1;
        int dps_x = cells[j].second + 1;
        if (celulas.find(make_pair(ant_x, cells[ini].first)) == celulas.end()) {
          if (canGet(livres, bloqueadas, now_bloqueadas, cells[ini].first,
                     ant_x))
            now_livres.insert(ant_x);
        }
        if (celulas.find(make_pair(dps_x, cells[ini].first)) == celulas.end()) {
          if (canGet(livres, bloqueadas, now_bloqueadas, cells[ini].first,
                     dps_x))
            now_livres.insert(dps_x);
        }
      }
      int ct = 0;
      for (set<int>::iterator it = livres.begin(); it != livres.end(); it++) {
        int now_x = *it;
        if (celulas.find(make_pair(now_x, cells[ini].first)) == celulas.end()) {
          if (canGet(livres, bloqueadas, now_bloqueadas, cells[ini].first,
                     now_x)) {
            now_livres.insert(now_x);
            ct++;
          }
        }
        if (ct == 10) break;
      }
    }
    livres = now_livres;
    bloqueadas = now_bloqueadas;
  }
  set<int>::iterator it = livres.end();
  if (livres.size() >= 1) {
    it--;
    if (*it == n) return true;
    return false;
  }
  return false;
}
int main() {
  int m;
  scanf("%d %d", &n, &m);
  for (int i = 0; i < m; i++) {
    int x, y;
    scanf("%d %d", &x, &y);
    colunas.insert(y);
    celulas.insert(make_pair(x, y));
    cells.push_back(make_pair(y, x));
  }
  colunas.insert(1);
  colunas.insert(n);
  for (set<int>::iterator it = colunas.begin(); it != colunas.end(); it++) {
    celulas.insert(make_pair(0, *it));
    celulas.insert(make_pair(n + 1, *it));
    cells.push_back(make_pair(*it, 0));
    cells.push_back(make_pair(*it, n + 1));
  }
  sort(cells.begin(), cells.end());
  if (canReach()) {
    printf("%d\n", 2 * n - 2);
  } else {
    printf("-1\n");
  }
  return 0;
}
