#include <bits/stdc++.h>
using namespace std;
using lint = long long int;
using pint = pair<int, int>;
using plint = pair<lint, lint>;
struct fast_ios {
  fast_ios() {
    cin.tie(0);
    ios::sync_with_stdio(false);
    cout << fixed << setprecision(20);
  };
} fast_ios_;
template <typename T>
istream &operator>>(istream &is, vector<T> &vec) {
  for (auto &v : vec) is >> v;
  return is;
}
template <typename T>
ostream &operator<<(ostream &os, const vector<T> &vec) {
  os << "[";
  for (auto v : vec) os << v << ",";
  os << "]";
  return os;
}
template <typename T>
ostream &operator<<(ostream &os, const deque<T> &vec) {
  os << "deq[";
  for (auto v : vec) os << v << ",";
  os << "]";
  return os;
}
template <typename T>
ostream &operator<<(ostream &os, const set<T> &vec) {
  os << "{";
  for (auto v : vec) os << v << ",";
  os << "}";
  return os;
}
template <typename T>
ostream &operator<<(ostream &os, const unordered_set<T> &vec) {
  os << "{";
  for (auto v : vec) os << v << ",";
  os << "}";
  return os;
}
template <typename T>
ostream &operator<<(ostream &os, const multiset<T> &vec) {
  os << "{";
  for (auto v : vec) os << v << ",";
  os << "}";
  return os;
}
template <typename T>
ostream &operator<<(ostream &os, const unordered_multiset<T> &vec) {
  os << "{";
  for (auto v : vec) os << v << ",";
  os << "}";
  return os;
}
template <typename T1, typename T2>
ostream &operator<<(ostream &os, const pair<T1, T2> &pa) {
  os << "(" << pa.first << "," << pa.second << ")";
  return os;
}
template <typename TK, typename TV>
ostream &operator<<(ostream &os, const map<TK, TV> &mp) {
  os << "{";
  for (auto v : mp) os << v.first << "=>" << v.second << ",";
  os << "}";
  return os;
}
template <typename TK, typename TV>
ostream &operator<<(ostream &os, const unordered_map<TK, TV> &mp) {
  os << "{";
  for (auto v : mp) os << v.first << "=>" << v.second << ",";
  os << "}";
  return os;
}
template <typename T>
void ndarray(vector<T> &vec, int len) {
  vec.resize(len);
}
template <typename T, typename... Args>
void ndarray(vector<T> &vec, int len, Args... args) {
  vec.resize(len);
  for (auto &v : vec) ndarray(v, args...);
}
template <typename T>
void Max(T &m, const T q) {
  if (m < q) m = q;
}
template <typename T>
void Min(T &m, const T q) {
  if (m > q) m = q;
}
template <typename T1, typename T2>
pair<T1, T2> operator+(pair<T1, T2> &l, pair<T1, T2> &r) {
  return make_pair(l.first + r.first, l.second + r.second);
}
template <typename T1, typename T2>
pair<T1, T2> operator-(pair<T1, T2> &l, pair<T1, T2> &r) {
  return make_pair(l.first - r.first, l.second - r.second);
}
int N, M;
vector<set<int>> to;
vector<lint> score;
int main() {
  cin >> N >> M;
  to.resize(N);
  for (int _ = (0), __end_ = (M); _ < __end_; _++) {
    int a, b;
    cin >> a >> b;
    a--;
    b--;
    to[a].insert(b);
    to[b].insert(a);
  }
  queue<int> haji;
  for (int i = (0), i_end_ = (N); i < i_end_; i++)
    if (to[i].size() == 1) haji.push(i);
  score.resize(N, 1);
  set<int> nokori;
  for (int i = (0), i_end_ = (N); i < i_end_; i++) nokori.insert(i);
  lint res = 0;
  while (!haji.empty()) {
    int now = haji.front();
    haji.pop();
    if (to[now].empty()) continue;
    int nxt = *to[now].begin();
    res += abs(score[now]);
    score[nxt] -= score[now];
    to[now].clear();
    nokori.erase(now);
    to[nxt].erase(now);
    if (to[nxt].size() == 1) haji.push(nxt);
  }
  if (nokori.size() == 1) {
    cout << (score[*nokori.begin()] == 0 ? res : -1) << endl;
    return 0;
  } else {
    vector<lint> yy;
    int now = *nokori.begin();
    while (to[now].size() >= 1) {
      int nxt = *to[now].begin();
      to[now].erase(nxt);
      to[nxt].erase(now);
      yy.push_back(score[nxt]);
      now = nxt;
    }
    if (nokori.size() % 2 == 1) {
      lint su = accumulate(yy.begin(), yy.end(), 0LL);
      if (su % 2 == 1) {
        cout << -1 << endl;
        return 0;
      } else
        su /= 2;
      for (int i = 1; i < yy.size(); i += 2) su -= yy[i];
      for (int i = (0), i_end_ = (yy.size()); i < i_end_; i++) {
        res += abs(su);
        su = yy[i] - su;
      }
      cout << res << endl;
    } else {
      vector<lint> su(2);
      for (int i = (0), i_end_ = (yy.size()); i < i_end_; i++)
        su[i % 2] += yy[i];
      if (su[0] != su[1]) {
        cout << -1 << endl;
        return 0;
      } else {
        vector<lint> v;
        lint n = 0;
        for (int i = (0), i_end_ = (N); i < i_end_; i++) {
          v.push_back(n * (i % 2 == 0 ? 1 : -1));
          n = yy[i] - n;
        }
        sort(v.begin(), v.end());
        for (int i = (0), i_end_ = (v.size()); i < i_end_; i++)
          res += abs(v[i] - v[v.size() / 2]);
        cout << res << endl;
      }
    }
  }
}
