#include <bits/stdc++.h>
using namespace std;
void ga(int N, int *A) {
  for (int i(0); i < N; i++) scanf("%d", A + i);
}
struct eg {
  int a, l, r;
  bool operator<(const eg &r) const { return l > r.l; }
} h;
vector<eg> g[(1 << 20)][2];
int N, M, a, b, c, d, B, J;
priority_queue<pair<int, int> > Q;
int dj() {
  Q.push({0, 0});
  while (!Q.empty()) {
    B = a = -Q.top().first, b = Q.top().second, Q.pop(), J = a & 1;
    if (b + 1 == N) return a;
    while (!g[b][J].empty() && g[b][J].back().l <= B) {
      h = g[b][J].back(), g[b][J].pop_back(), B = max(B, h.r);
      if (B % 2 != J) --B;
      if (h.r < a) continue;
      d = max(h.l, a);
      if (d % 2 != J) ++d;
      if (d + 1 <= h.r && d >= h.l) Q.push({-d - 1, h.a});
    }
  }
  return -1;
}
int main(void) {
  scanf("%d%d", &N, &M);
  for (int i(0); i < M; i++) {
    scanf("%d%d%d%d", &a, &b, &c, &d), --a, --b;
    for (int j(0); j < 2; j++)
      g[a][j].push_back({b, c, d}), g[b][j].push_back({a, c, d});
  }
  for (int i(0); i < N; i++)
    for (int j(0); j < 2; j++) sort(g[i][j].begin(), g[i][j].end());
  printf("%d\n", dj());
  return 0;
}
