# -*- coding: utf-8 -*-



N, M = list(map(int, input().split()))



# 入力値の頂点ペア(辺)を格納する配列

a = [0] * 50

b = [0] * 50

# 頂点ペアが隣接しているかどうかを格納する配列

graph = [[False for i in range(50)] for j in range(50)]

# ある頂点が訪問済かどうかを格納する配列

visited = [False] * N



# 入力値の頂点ペア(辺)を格納していくループ

for i in range(M):

    a[i], b[i] = list(map(int, input().split()))

    # 添字に合わせて入力値から1減らしておく

    a[i] -= 1

    b[i] -= 1

    # 入力値の内容に合わせて、隣接していることを記録

    graph[a[i]][b[i]] = True

    graph[b[i]][a[i]] = True



# 連結かどうか(全ての頂点が訪問済かどうか)を判定するDFS

def dfs(v):

    # 関数内で使用する変数のglobal宣言

    global graph

    global visited

    # 通った頂点は訪問済にする

    visited[v] = True

    for v2 in range(N):

        # 隣接していないor訪問済はやる意味ないのでcontinue

        if graph[v][v2] == False or visited[v2] == True:

            continue

        # 調べる必要のある箇所は再帰的に調べていく

        dfs(v2)



ans = 0

# 各辺について、橋かどうかを判定していくループ

for i in range(M):

    # まず該当の辺を外す(この状態で連結ではなくなってしまえばそれは橋)

    graph[a[i]][b[i]] = False

    graph[b[i]][a[i]] = False

    # 訪問済判定を初期化

    for j in range(N):

        visited[j] = False

    # 連結かどうか(全ての頂点が訪問済かどうか)を判定するDFS

    dfs(0)

    # 各頂点について、訪問済かどうかを確認していく

    bridge = False

    for j in range(N):

        # 頂点で一つでも未訪問の箇所があれば橋と判定する

        if visited[j] == False:

            bridge = True

    if bridge:

        ans += 1

    # 外した辺を元に戻す

    graph[a[i]][b[i]] = True

    graph[b[i]][a[i]] = True



print(ans)
# -*- coding: utf-8 -*-



import sys

from collections import deque



def input(): return sys.stdin.readline().strip()

def list2d(a, b, c): return [[c] * b for i in range(a)]

def list3d(a, b, c, d): return [[[d] * c for j in range(b)] for i in range(a)]

def list4d(a, b, c, d, e): return [[[[e] * d for j in range(c)] for j in range(b)] for i in range(a)]

def ceil(x, y=1): return int(-(-x // y))

def INT(): return int(eval(input()))

def MAP(): return list(map(int, input().split()))

def LIST(N=None): return list(MAP()) if N is None else [INT() for i in range(N)]

def Yes(): print('Yes')

def No(): print('No')

def YES(): print('YES')

def NO(): print('NO')

sys.setrecursionlimit(10 ** 9)

INF = 10 ** 18

MOD = 10 ** 9 + 7



N, M = MAP()

edges = []

for i in range(M):

    a, b = MAP()

    a -= 1; b -= 1

    edges.append((a, b))



def check(x):

    nodes = [[] for i in range(N)]

    for i in range(M):

        # 辺x以外でグラフを構築する

        if i == x:

            continue

        a, b = edges[i]

        nodes[a].append(b)

        nodes[b].append(a)

    # BFSで到達確認

    que = deque([0])

    visited = [0] * N

    while que:

        u = que.popleft()

        if visited[u]:

            continue

        visited[u] = 1

        for v in nodes[u]:

               que.append(v)

    # 全ての辺に到達できたか

    return sum(visited) != N



ans = 0

for x in range(M):

    # 辺xを除いて、到達できなくなる場所があればこの辺は橋

    if check(x):

        ans += 1

print(ans)

# -*- coding: utf-8 -*-
N, M = list(map(int, input().split()))
# 入力値の頂点ペア(辺)を格納する配列
a = [0] * 50
b = [0] * 50
# 頂点ペアが隣接しているかどうかを格納する配列
graph = [[False for i in range(50)] for j in range(50)]
# ある頂点が訪問済かどうかを格納する配列
visited = [False] * N
# 入力値の頂点ペア(辺)を格納していくループ
for i in range(M):
    a[i], b[i] = list(map(int, input().split()))
    # 添字に合わせて入力値から1減らしておく
    a[i] -= 1
    b[i] -= 1
    # 入力値の内容に合わせて、隣接していることを記録
    graph[a[i]][b[i]] = True
    graph[b[i]][a[i]] = True
# 連結かどうか(全ての頂点が訪問済かどうか)を判定するDFS
def dfs(v):
    # 関数内で使用する変数のglobal宣言
    global graph
    global visited
    # 通った頂点は訪問済にする
    visited[v] = True
    for v2 in range(N):
        # 隣接していないor訪問済はやる意味ないのでcontinue
        if graph[v][v2] == False or visited[v2] == True:
            continue
        # 調べる必要のある箇所は再帰的に調べていく
        dfs(v2)


ans = 0
# 各辺について、橋かどうかを判定していくループ
for i in range(M):
    # まず該当の辺を外す(この状態で連結ではなくなってしまえばそれは橋)
    graph[a[i]][b[i]] = False
    graph[b[i]][a[i]] = False
    # 訪問済判定を初期化
    for j in range(N):
        visited[j] = False
    # 連結かどうか(全ての頂点が訪問済かどうか)を判定するDFS
    dfs(0)
    # 各頂点について、訪問済かどうかを確認していく
    bridge = False
    for j in range(N):
        # 頂点で一つでも未訪問の箇所があれば橋と判定する
        if visited[j] == False:
            bridge = True
    if bridge:
        ans += 1
    # 外した辺を元に戻す
    graph[a[i]][b[i]] = True
    graph[b[i]][a[i]] = True
print(ans)

# -*- coding: utf-8 -*-
import sys
from collections import deque


def input():
    return sys.stdin.readline().strip()


def list2d(a, b, c):
    return [[c] * b for i in range(a)]


def list3d(a, b, c, d):
    return [[[d] * c for j in range(b)] for i in range(a)]


def list4d(a, b, c, d, e):
    return [[[[e] * d for j in range(c)] for j in range(b)] for i in range(a)]


def ceil(x, y=1):
    return int(-(-x // y))


def INT():
    return int(eval(input()))


def MAP():
    return list(map(int, input().split()))


def LIST(N=None):
    return list(MAP()) if N is None else [INT() for i in range(N)]


def Yes():
    print("Yes")


def No():
    print("No")


def YES():
    print("YES")


def NO():
    print("NO")


sys.setrecursionlimit(10**9)
INF = 10**18
MOD = 10**9 + 7
N, M = MAP()
edges = []
for i in range(M):
    a, b = MAP()
    a -= 1
    b -= 1
    edges.append((a, b))


def check(x):
    nodes = [[] for i in range(N)]
    for i in range(M):
        # 辺x以外でグラフを構築する
        if i == x:
            continue
        a, b = edges[i]
        nodes[a].append(b)
        nodes[b].append(a)
    # BFSで到達確認
    que = deque([0])
    visited = [0] * N
    while que:
        u = que.popleft()
        if visited[u]:
            continue
        visited[u] = 1
        for v in nodes[u]:
            que.append(v)
    # 全ての辺に到達できたか
    return sum(visited) != N


ans = 0
for x in range(M):
    # 辺xを除いて、到達できなくなる場所があればこの辺は橋
    if check(x):
        ans += 1
print(ans)

-N, M = list(map(int, input().split())) -# 入力値の頂点ペア(辺)を格納する配列 -a = [0] * 50 -b = [0] * 50 -# 頂点ペアが隣接しているかどうかを格納する配列 -graph = [[False for i in range(50)] for j in range(50)] -# ある頂点が訪問済かどうかを格納する配列 -visited = [False] * N -# 入力値の頂点ペア(辺)を格納していくループ +import sys +from collections import deque + + +def input(): +    return sys.stdin.readline().strip() + + +def list2d(a, b, c): +    return [[c] * b for i in range(a)] + + +def list3d(a, b, c, d): +    return [[[d] * c for j in range(b)] for i in range(a)] + + +def list4d(a, b, c, d, e): +    return [[[[e] * d for j in range(c)] for j in range(b)] for i in range(a)] + + +def ceil(x, y=1): +    return int(-(-x // y)) + + +def INT(): +    return int(eval(input())) + + +def MAP(): +    return list(map(int, input().split())) + + +def LIST(N=None): +    return list(MAP()) if N is None else [INT() for i in range(N)] + + +def Yes(): +    print("Yes") + + +def No(): +    print("No") + + +def YES(): +    print("YES") + + +def NO(): +    print("NO") + + +sys.setrecursionlimit(10**9) +INF = 10**18 +MOD = 10**9 + 7 +N, M = MAP() +edges = [] -    a[i], b[i] = list(map(int, input().split())) -    # 添字に合わせて入力値から1減らしておく -    a[i] -= 1 -    b[i] -= 1 -    # 入力値の内容に合わせて、隣接していることを記録 -    graph[a[i]][b[i]] = True -    graph[b[i]][a[i]] = True -# 連結かどうか(全ての頂点が訪問済かどうか)を判定するDFS -def dfs(v): -    # 関数内で使用する変数のglobal宣言 -    global graph -    global visited -    # 通った頂点は訪問済にする -    visited[v] = True -    for v2 in range(N): -        # 隣接していないor訪問済はやる意味ないのでcontinue -        if graph[v][v2] == False or visited[v2] == True: +    a, b = MAP() +    a -= 1 +    b -= 1 +    edges.append((a, b)) + + +def check(x): +    nodes = [[] for i in range(N)] +    for i in range(M): +        # 辺x以外でグラフを構築する +        if i == x: -        # 調べる必要のある箇所は再帰的に調べていく -        dfs(v2) +        a, b = edges[i] +        nodes[a].append(b) +        nodes[b].append(a) +    # BFSで到達確認 +    que = deque([0]) +    visited = [0] * N +    while que: +        u = que.popleft() +        if visited[u]: +            continue +        visited[u] = 1 +        for v in nodes[u]: +            que.append(v) +    # 全ての辺に到達できたか +    return sum(visited) != N -# 各辺について、橋かどうかを判定していくループ -for i in range(M): -    # まず該当の辺を外す(この状態で連結ではなくなってしまえばそれは橋) -    graph[a[i]][b[i]] = False -    graph[b[i]][a[i]] = False -    # 訪問済判定を初期化 -    for j in range(N): -        visited[j] = False -    # 連結かどうか(全ての頂点が訪問済かどうか)を判定するDFS -    dfs(0) -    # 各頂点について、訪問済かどうかを確認していく -    bridge = False -    for j in range(N): -        # 頂点で一つでも未訪問の箇所があれば橋と判定する -        if visited[j] == False: -            bridge = True -    if bridge: +for x in range(M): +    # 辺xを除いて、到達できなくなる場所があればこの辺は橋 +    if check(x): -    # 外した辺を元に戻す -    graph[a[i]][b[i]] = True -    graph[b[i]][a[i]] = True