#include <bits/stdc++.h>
using namespace std;
const int inf = (int)1e8;
vector<int> g[1500];
int color[1500];
vector<int> a[1500];
int C, n, m, root, mx;
char used[1500];
vector<pair<int, int> > e;
int d[1500];
void kill() {
  cout << -1 << '\n';
  exit(0);
}
void dfs(int v, int cl) {
  color[v] = cl;
  a[C].push_back(v);
  for (int i = 0; i < g[v].size(); ++i) {
    int to = g[v][i];
    if (!color[to]) dfs(to, 3 - cl);
  }
  return;
}
void dfs1(int v, int dist) {
  used[v] = 1;
  if (dist > mx) {
    root = v;
    mx = dist;
  }
  for (int i = 0; i < g[v].size(); ++i) {
    int to = g[v][i];
    if (!used[to]) {
      dfs1(to, dist + 1);
    }
  }
  return;
}
int bfs(int v) {
  d[v] = 0;
  for (int i = 1; i <= n; ++i) {
    d[i] = inf;
  }
  d[v] = 0;
  int mx = 0;
  queue<int> q;
  q.push(v);
  while (!q.empty()) {
    int v = q.front();
    q.pop();
    for (int i = 0; i < g[v].size(); ++i) {
      int to = g[v][i];
      if (d[to] == inf) {
        d[to] = d[v] + 1;
        mx = max(mx, d[to]);
        q.push(to);
      }
    }
  }
  return mx;
}
int length(int comp) {
  int res = 0;
  for (int i = 0; i < a[comp].size(); ++i) {
    int v = a[comp][i];
    res = max(res, bfs(v));
  }
  return res;
}
int main() {
  cin >> n >> m;
  for (int i = 0; i < m; ++i) {
    int a, b;
    cin >> a >> b;
    g[a].push_back(b);
    g[b].push_back(a);
    e.push_back(make_pair(a, b));
  }
  for (int v = 1; v <= n; ++v) {
    if (!color[v]) {
      dfs(v, 1);
      C++;
    }
  }
  for (int i = 0; i < e.size(); ++i) {
    if (color[e[i].first] == color[e[i].second]) kill();
  }
  int answer = 0;
  for (int i = 0; i < C; ++i) {
    answer += length(i);
  }
  cout << answer << '\n';
  return 0;
}
