#!/usr/bin/env python3
import itertools

n, m = map(int, input().split())
g = [[] for _ in range(n)]
for _ in range(m):
    u, v = map(int, input().split())
    u -= 1
    v -= 1
    g[u].append(v)
    g[v].append(u)

special_edges = []
tree = [[] for _ in range(n)]

done = [False] * n
def dfs(u, p):
    assert not done[u]
    done[u] = True
    for v in g[u]:
        if v == p: continue
        if done[v]:
            if u < v: special_edges.append([u, v])
        else:
            tree[u].append(v)
            dfs(v, u)

dfs(0, -1)

assert len(special_edges) == m-n+1

ans = 0

for cs in itertools.product([0,1,2], repeat=len(special_edges)):
    colours = [None] * n
    pos = True
    for i, c in enumerate(cs):
        if c & 1:
            if colours[special_edges[i][0]] is False: pos = False
            colours[special_edges[i][0]] = True
        else:
            if colours[special_edges[i][0]] is True: pos = False
            colours[special_edges[i][0]] = False
        if c & 2:
            if colours[special_edges[i][1]] is False: pos = False
            colours[special_edges[i][1]] = True
        else:
            if colours[special_edges[i][1]] is True: pos = False
            colours[special_edges[i][1]] = False

    if not pos:
        continue

    # Return a pair for whether this vertex is False or (False or True).
    # The first component may be Null.
    def dfs2(u):
        f, t = (0, 1)

        if colours[u] is True: f = -1000000
        elif colours[u] is False: t = -1000000

        for v in tree[u]:
            fv, tv = dfs2(v)
            f += tv
            t += fv
    
        if colours[u] is False: t = f
        else: t = max(t, f)
        return f, t


    i = dfs2(0)[1]
    if i is not None:
        ans = max(ans, i)

print(ans)
