← Home
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()
}