#include <bits/stdc++.h>

using namespace std;

int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  int n, m;
  cin >> n >> m;
  vector<vector<int>> g(n);
  for (int i = 0; i < m; i++) {
    int u, v;
    cin >> u >> v;
    --u; --v;
    g[u].push_back(v);
    g[v].push_back(u);
  }
  vector<int> que(1, n - 1);
  vector<int> dist(n, -1);
  dist.back() = 0;
  vector<vector<int>> nei(n);
  vector<vector<int>> back(n);
  vector<int> pr(n, -1);
  for (int b = 0; b < int(que.size()); b++) {
    int i = que[b];
    for (int j : g[i]) {
      if (dist[j] == -1) {
        dist[j] = dist[i] + 1;
        que.push_back(j);
        nei[i].push_back(j);
        nei[j].push_back(i);
        pr[j] = i;
        // cout << "edge (" << i << ", " << j << ")" << '\n';
      } else if (j != pr[i]) {
        back[i].push_back(j);
        // cout << "back edge (" << i << ", " << j << ")" << '\n';
      }
    }
  }
  if (pr[0] == -1) {
    cout << -1 << '\n';
    return 0;
  }
  vector<int> d0(n, -1);
  {
    d0[0] = 0;
    vector<int> que(1, 0);
    for (int b = 0; b < int(que.size()); b++) {
      int i = que[b];
      for (int j : g[i]) {
        if (d0[j] == -1) {
          d0[j] = d0[i] + 1;
          que.push_back(j);
        }
      }
    }
  }
  vector<int> who(n);
  vector<int> dfn(n);
  vector<int> dfo(n);
  int T = -1;
  auto Dfs = [&](auto&& self, int v, int pv) -> void {
    dfn[v] = ++T;
    who[T] = v;
    for (int u : nei[v]) {
      if (u == pv) {
        continue;
      }
      self(self, u, v);
    }
    dfo[v] = T;
  };
  Dfs(Dfs, n - 1, -1);
  const int inf = int(1e9);
  auto Query = [&](int v, int l, int r) {
    int f = inf;
    for (int t = 0; t < n; t++) {
      if (l <= t && t <= r) {
        continue;
      }
      int i = who[t];
      for (int to : back[i]) {
        if (l <= dfn[to] && dfo[to] <= r) {
          f = min(f, dist[to] - dist[v] + 1 + dist[i]);
        }
      }
    }
    return f;
  };
  vector<int> val(n);
  for (int i = 0; i < n; i++) {
    val[i] = Query(i, dfn[i], dfo[i]);
  }
  val[n - 1] = 0;
  /* cout << "val = ";
  for (int i = 0; i < n; i++) {
    cout << val[i] << " ";
  }
  cout << '\n'; */
  function<bool(int)> Check = [&](int t) {
    vector<bool> good(n);
    for (int i = 0; i < n; i++) {
      good[i] = (d0[i] + val[i] <= t);
    }
    vector<vector<int>> gf(n);
    for (int i = 0; i < n; i++) {
      if (d0[i] + val[i] <= t) {
        for (int j : g[i]) {
          gf[i].push_back(j);
          gf[j].push_back(i);
        }
      }
    }
    if (!good[0]) {
      return false;
    }
    vector<int> que(1, 0);
    vector<bool> was(n);
    was[0] = true;
    for (int b = 0; b < int(que.size()); b++) {
      int i = que[b];
      for (int j : gf[i]) {
        if (!was[j] && good[j]) {
          was[j] = true;
          que.push_back(j);
        }
      }
    }
    if (was[n - 1]) {
      return true;
    } else {
      return false;
    }
  };
  int low = 0, high = inf, res = inf;
  while (low <= high) {
    int mid = low + high >> 1;
    if (Check(mid)) {
      res = mid;
      high = mid - 1;
    } else {
      low = mid + 1;
    }
  }
  cout << (res == inf ? -1 : res) << '\n';
  return 0;
}