#include <bits/stdc++.h>
using namespace std;
template <typename T>
inline T gi() {
  T f = 1, x = 0;
  char c = getchar();
  while (c < '0' || c > '9') {
    if (c == '-') f = -1;
    c = getchar();
  }
  while (c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
  return f * x;
}
const int INF = 0x3f3f3f3f, N = 1003, M = 200003;
int n, m;
int tot, head[N], ver[M], nxt[M];
int col[N], len[N], dis[N], ans;
bool vis[N];
int in[N];
inline void add(int u, int v) {
  ver[++tot] = v, nxt[tot] = head[u], head[u] = tot;
}
bool dfs(int u, int c, int w) {
  if (col[u] && col[u] != c) return false;
  col[u] = c;
  for (int i = head[u]; i; i = nxt[i]) {
    int v = ver[i];
    in[v] = w;
    if (col[v] && col[v] != 3 - c) return false;
    if (!col[v] && !dfs(v, 3 - c, w)) return false;
  }
  return true;
}
inline void bfs(int s) {
  queue<int> q;
  for (int i = 1; i <= n; i += 1) vis[i] = false;
  q.push(s);
  vis[s] = true;
  len[s] = 0;
  while (!q.empty()) {
    int u = q.front();
    q.pop();
    for (int i = head[u]; i; i = nxt[i]) {
      int v = ver[i];
      if (vis[v]) continue;
      len[v] = len[u] + 1;
      vis[v] = true;
      q.push(v);
    }
  }
  return;
}
int main() {
  n = gi<int>(), m = gi<int>();
  for (int i = 1; i <= m; i += 1) {
    int u = gi<int>(), v = gi<int>();
    add(u, v), add(v, u);
  }
  int tot = 0;
  for (int i = 1; i <= n; i += 1)
    if (!col[i]) {
      in[i] = ++tot;
      if (!dfs(i, 1, tot)) {
        puts("-1");
        return 0;
      }
    }
  memset(len, 0x3f, sizeof len);
  for (int i = 1; i <= n; i += 1) {
    bfs(i);
    for (int j = 1; j <= n; j += 1)
      if (in[j] == in[i]) dis[in[i]] = max(dis[in[i]], len[j]);
  }
  for (int i = 1; i <= tot; i += 1) ans += dis[i];
  printf("%d\n", ans);
  return 0;
}
