#include <bits/stdc++.h>
using namespace std;
const int N = 100 * 1000 + 10;
int n, m;
int t1, t2;
vector<vector<int> > v;
vector<int> a;
vector<int> b;
int d[N];
int p = -1, o;
queue<int> q;
bool mark[N];
bool mark2[N];
int C[N];
void dfs(int x, int c) {
  C[x] = c;
  mark[x] = 1;
  for (int i = 0; i < ((int)v[x].size()); ++i) {
    int w = v[x][i];
    if (!mark[w]) {
      dfs(w, 1 - c);
    }
  }
}
bool isn2p() {
  for (int i = 0; i < n; ++i) {
    if (!mark[i]) {
      dfs(i, 0);
    }
  }
  for (int i = 0; i < ((int)a.size()); ++i) {
    if (C[a[i]] == C[b[i]]) {
      return true;
    }
  }
  return false;
}
void bfs(int x) {
  memset(d, -1, sizeof(d));
  q.push(x);
  d[x] = 0;
  if (d[x] > p) p = d[x];
  while (!q.empty()) {
    int u = q.front();
    mark2[u] = 1;
    mark[u] = 1;
    for (int i = 0; i < ((int)v[u].size()); ++i) {
      int w = v[u][i];
      if (d[w] == -1) {
        d[w] = d[u] + 1;
        if (d[w] > p) {
          p = d[w];
        }
        q.push(w);
      }
    }
    q.pop();
  }
}
int main() {
  cin >> n >> m;
  v.resize(n);
  for (int i = 0; i < m; ++i) {
    cin >> t1 >> t2;
    t1--;
    t2--;
    v[t1].push_back(t2);
    v[t2].push_back(t1);
    a.push_back(t1);
    b.push_back(t2);
  }
  if (isn2p()) {
    cout << "-1\n";
    return 0;
  }
  int sum = 0;
  for (int i = 0; i < n; ++i) {
    p = -2;
    if (!mark2[i]) {
      memset(mark, 0, sizeof(mark));
      bfs(i);
      for (int j = 0; j < n; ++j) {
        if (mark[j] && j != i) {
          bfs(j);
        }
      }
      sum += (p);
    }
    mark2[i] = 0;
  }
  cout << sum << "\n";
  return 0;
}
