package main
import (
"bufio"
"fmt"
"io"
"os"
)
func main() {
data, _ := io.ReadAll(os.Stdin)
idx := 0
readInt := func() int {
for idx < len(data) && (data[idx] < '0' || data[idx] > '9') {
idx++
}
val := 0
for idx < len(data) && data[idx] >= '0' && data[idx] <= '9' {
val = val*10 + int(data[idx]-'0')
idx++
}
return val
}
n := readInt()
m := readInt()
g := make([][]int, n)
for i := 0; i < m; i++ {
a := readInt() - 1
b := readInt() - 1
g[a] = append(g[a], b)
g[b] = append(g[b], a)
}
color := make([]int, n)
for i := 0; i < n; i++ {
color[i] = -1
}
queue := make([]int, n)
components := make([][]int, 0)
for i := 0; i < n; i++ {
if color[i] != -1 {
continue
}
head, tail := 0, 0
queue[tail] = i
tail++
color[i] = 0
comp := make([]int, 0)
for head < tail {
v := queue[head]
head++
comp = append(comp, v)
for _, to := range g[v] {
if color[to] == -1 {
color[to] = color[v] ^ 1
queue[tail] = to
tail++
} else if color[to] == color[v] {
fmt.Print(-1)
return
}
}
}
components = append(components, comp)
}
dist := make([]int, n)
ans := 0
for _, comp := range components {
diam := 0
for _, s := range comp {
for i := 0; i < n; i++ {
dist[i] = -1
}
head, tail := 0, 0
queue[tail] = s
tail++
dist[s] = 0
for head < tail {
v := queue[head]
head++
if dist[v] > diam {
diam = dist[v]
}
for _, to := range g[v] {
if dist[to] == -1 {
dist[to] = dist[v] + 1
queue[tail] = to
tail++
}
}
}
}
ans += diam
}
out := bufio.NewWriter(os.Stdout)
fmt.Fprint(out, ans)
out.Flush()
}