#include <bits/stdc++.h>
using namespace std;
vector<int> g[101010];
int color[101010];
int black_all, white_all, type, start, goal;
long long ans;
bool in_start[101010], in_goal[101010];
vector<int> flow;
void check(int v, int prev, int d) {
  color[v] = d;
  if (d & 1)
    black_all++;
  else
    white_all++;
  for (auto u : g[v])
    if (u != prev) {
      if (color[u] == -1) {
        check(u, v, 1 - d);
      } else {
        start = v;
        goal = u;
        if (color[u] == 1 - d) {
          type = 1;
        } else {
          type = 2;
        }
      }
    }
}
pair<int, int> dfs(int v, int prev, int d) {
  int black = 0, white = 0;
  for (auto u : g[v])
    if (u != prev) {
      pair<int, int> get = dfs(u, v, d + 1);
      black += get.first;
      white += get.second;
    }
  if (d & 1)
    black++;
  else
    white++;
  ans += abs(black - white);
  return make_pair(black, white);
}
pair<int, int> dfs2(int v, int prev, int d) {
  int black = 0, white = 0;
  in_start[v] = false, in_goal[v] = false;
  if (v == start) in_start[v] = true;
  if (v == goal) in_goal[v] = true;
  for (auto u : g[v])
    if (u != prev) {
      pair<int, int> get = dfs2(u, v, d + 1);
      in_start[v] |= in_start[u];
      in_goal[v] |= in_goal[u];
      black += get.first;
      white += get.second;
    }
  if (d & 1)
    black++;
  else
    white++;
  if ((in_start[v] && in_goal[v]) || (!in_start[v] && !in_goal[v])) {
    ans += abs(black - white);
  } else {
    flow.push_back(black - white);
  }
  return make_pair(black, white);
}
int main() {
  int n, m;
  scanf("%d%d", &n, &m);
  for (int i = 0; i < m; i++) {
    int a, b;
    scanf("%d%d", &a, &b);
    a--, b--;
    g[a].push_back(b);
    g[b].push_back(a);
  }
  type = 0;
  memset(color, -1, sizeof color);
  check(0, -1, 0);
  if (type == 0 || type == 1) {
    if (black_all != white_all) {
      puts("-1");
      return 0;
    }
  }
  if (type == 2) {
    if (black_all % 2 != white_all % 2) {
      puts("-1");
      return 0;
    }
  }
  if (type == 0) {
    dfs(0, -1, 0);
    printf("%lld\n", ans);
  } else if (type == 1) {
    for (int i = 0; i < g[start].size(); i++) {
      if (g[start][i] == goal) {
        g[start].erase(g[start].begin() + i);
      }
    }
    for (int i = 0; i < g[goal].size(); i++) {
      if (g[goal][i] == start) {
        g[goal].erase(g[goal].begin() + i);
      }
    }
    dfs2(0, -1, 0);
    int lb = -101010, ub = 101010;
    int cnt = 0;
    while (ub - lb > 0) {
      cnt++;
      if (cnt > 100) break;
      int left = (lb * 2 + ub) / 3;
      int right = (lb + ub * 2) / 3;
      int left_ans = 0, right_ans = 0;
      for (auto f : flow) {
        left_ans += abs(left + f);
        right_ans += abs(right + f);
      }
      if (left_ans < right_ans)
        ub = right;
      else
        lb = left;
    }
    int res = 0x3f3f3f3f;
    for (int i = lb - 10; i < lb + 10; i++) {
      int sum = 0;
      for (auto f : flow) {
        sum += abs(i + f);
      }
      sum += abs(i);
      res = min(res, sum);
    }
    ans += res;
    printf("%lld\n", ans);
  }
  return 0;
}
