# pythonでスタック、キューを実現するためにdequeをimport

from collections import deque



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



# 辺集合EとグラフGの構築

G = [[] for _ in range(N)]

E = []

for _ in range(M):

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

    # 入力は1-indexedだがこれを扱いやすいように0-indexedに変更

    a -= 1

    b -= 1

    E.append((a, b))

    G[a].append(b)

    G[b].append(a)

# print(G)



# 橋を数えるための変数cntを用意

cnt = 0

for edge_to_remove in E:

    # 橋であるか判定したい辺を取り除いてみる

    i, j = edge_to_remove

    G[i].remove(j)

    G[j].remove(i)



    # 深さ優先探索

    seen = [False] * N

    todo = deque()

    # 適当な頂点から深さ優先探索をスタート（ここでは頂点0をスタートに選んだ）

    todo.append(0)

    seen[0] = True

    seen_nodes_num = 0

    while todo:

        here = todo.pop()

        seen_nodes_num += 1

        for neighbor in G[here]:

            if seen[neighbor] == False:

                seen[neighbor] = True

                todo.append(neighbor)

    # print(seen)

    # もし訪問できていない頂点があれば連結でないというなので今着目している辺は橋であった！

    if seen_nodes_num != N:

        cnt += 1



    # 次の辺について調べるために今取り除いた辺を再びGに戻しておく

    G[i].append(j)

    G[j].append(i)

print(cnt)

# pythonでスタック、キューを実現するためにdequeをimport

from collections import deque



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



# 辺集合EとグラフGの構築

G = [[] for _ in range(N)]

E = []

for _ in range(M):

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

    # 入力は1-indexedだがこれを扱いやすいように0-indexedに変更

    a -= 1

    b -= 1

    E.append((a, b))

    G[a].append(b)

    G[b].append(a)

# print(G)



# 橋を数えるための変数cntを用意

cnt = 0

for edge_to_remove in E:

    # 橋であるか判定したい辺を取り除いてみる

    i, j = edge_to_remove

    G[i].remove(j)

    G[j].remove(i)



    # 深さ優先探索

    seen = set()

    todo = deque()

    # 適当な頂点から深さ優先探索をスタート（ここでは頂点0をスタートに選んだ）

    todo.append(0)

    seen.add(0)

    while todo:

        here = todo.pop()

        for neighbor in G[here]:

            if neighbor not in seen:

                seen.add(neighbor)

                todo.append(neighbor)

    # print(seen)

    # もし訪問できていない頂点があれば連結でないというなので今着目している辺は橋であった！

    if len(seen) < N:

        cnt += 1



    # 次の辺について調べるために今取り除いた辺を再びGに戻しておく

    G[i].append(j)

    G[j].append(i)

print(cnt)

# pythonでスタック、キューを実現するためにdequeをimport
from collections import deque

N, M = list(map(int, input().split()))
# 辺集合EとグラフGの構築
G = [[] for _ in range(N)]
E = []
for _ in range(M):
    a, b = list(map(int, input().split()))
    # 入力は1-indexedだがこれを扱いやすいように0-indexedに変更
    a -= 1
    b -= 1
    E.append((a, b))
    G[a].append(b)
    G[b].append(a)
# print(G)
# 橋を数えるための変数cntを用意
cnt = 0
for edge_to_remove in E:
    # 橋であるか判定したい辺を取り除いてみる
    i, j = edge_to_remove
    G[i].remove(j)
    G[j].remove(i)
    # 深さ優先探索
    seen = [False] * N
    todo = deque()
    # 適当な頂点から深さ優先探索をスタート（ここでは頂点0をスタートに選んだ）
    todo.append(0)
    seen[0] = True
    seen_nodes_num = 0
    while todo:
        here = todo.pop()
        seen_nodes_num += 1
        for neighbor in G[here]:
            if seen[neighbor] == False:
                seen[neighbor] = True
                todo.append(neighbor)
    # print(seen)
    # もし訪問できていない頂点があれば連結でないというなので今着目している辺は橋であった！
    if seen_nodes_num != N:
        cnt += 1
    # 次の辺について調べるために今取り除いた辺を再びGに戻しておく
    G[i].append(j)
    G[j].append(i)
print(cnt)

# pythonでスタック、キューを実現するためにdequeをimport
from collections import deque

N, M = list(map(int, input().split()))
# 辺集合EとグラフGの構築
G = [[] for _ in range(N)]
E = []
for _ in range(M):
    a, b = list(map(int, input().split()))
    # 入力は1-indexedだがこれを扱いやすいように0-indexedに変更
    a -= 1
    b -= 1
    E.append((a, b))
    G[a].append(b)
    G[b].append(a)
# print(G)
# 橋を数えるための変数cntを用意
cnt = 0
for edge_to_remove in E:
    # 橋であるか判定したい辺を取り除いてみる
    i, j = edge_to_remove
    G[i].remove(j)
    G[j].remove(i)
    # 深さ優先探索
    seen = set()
    todo = deque()
    # 適当な頂点から深さ優先探索をスタート（ここでは頂点0をスタートに選んだ）
    todo.append(0)
    seen.add(0)
    while todo:
        here = todo.pop()
        for neighbor in G[here]:
            if neighbor not in seen:
                seen.add(neighbor)
                todo.append(neighbor)
    # print(seen)
    # もし訪問できていない頂点があれば連結でないというなので今着目している辺は橋であった！
    if len(seen) < N:
        cnt += 1
    # 次の辺について調べるために今取り除いた辺を再びGに戻しておく
    G[i].append(j)
    G[j].append(i)
print(cnt)

-    seen = [False] * N +    seen = set() -    seen[0] = True -    seen_nodes_num = 0 +    seen.add(0) -        seen_nodes_num += 1 -            if seen[neighbor] == False: -                seen[neighbor] = True +            if neighbor not in seen: +                seen.add(neighbor) -    if seen_nodes_num != N: +    if len(seen) < N: