"""

解説PDFを見ながら実装

https://img.atcoder.jp/abc075/editorial.pdf

"""



def dfs(v, graph, visited, n):

    # 出発点

    visited[v] = True

    for i in range(n):

        # 辺がない

        if graph[v][i] == False:

            continue

        # 訪問済み

        if visited[i] == True:

            continue

        # 辺があったらそこから訪問する

        dfs(i, graph, visited, n)





def main():

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



    graph = []

    for _ in range(N):

        row = [False] * N

        graph.append(row)



    A = []

    B = []

    for _ in range(M):

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

        a = a - 1

        b = b - 1

        A.append(a)

        B.append(b)

        graph[a][b] = True

        graph[b][a] = True

    # print(graph)



    ans = 0



    for i in range(M):

        # 辺を削除

        graph[A[i]][B[i]] = False

        graph[B[i]][A[i]] = False



        visited = [False] * N



        # 常に0番目の頂点から出発

        dfs(0, graph, visited, N)



        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)



if __name__ == "__main__":

    main()


def main():

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

    AB = []

    for _ in range(M):

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

        AB.append([a-1, b-1])



    # グラフを表現する（辺のある・なし）

    graph = []

    for _ in range(N):

        graph.append([False] * N)



    for a, b in AB:

        graph[a][b] = True

        graph[b][a] = True

        

    visited = [False] * N



    def dfs(v):

        """v（頂点）からスタートする"""



        # 到達済みだったらreturn

        if visited[v]:

            return



        # 到達した印

        visited[v] = True



        # そのさきへ（vと繋がっている）

        edges = graph[v]

        for i, e in enumerate(edges):

            if e:

                dfs(i)



        return





    ans = 0

        

    # 辺を一つずつ消してみて、橋かどうかを調べる

    for a, b in AB:

        graph[a][b] = False

        graph[b][a] = False



        visited = [False] * N

        dfs(0)

        

        # 全てTrueというわけではない（Falseが一つでもある場合）

        if not all(visited):

            ans += 1



        graph[a][b] = True

        graph[b][a] = True



    print(ans)



if __name__ == "__main__":

    main()
"""
解説PDFを見ながら実装
https://img.atcoder.jp/abc075/editorial.pdf
"""


def dfs(v, graph, visited, n):
    # 出発点
    visited[v] = True
    for i in range(n):
        # 辺がない
        if graph[v][i] == False:
            continue
        # 訪問済み
        if visited[i] == True:
            continue
        # 辺があったらそこから訪問する
        dfs(i, graph, visited, n)


def main():
    N, M = list(map(int, input().split()))
    graph = []
    for _ in range(N):
        row = [False] * N
        graph.append(row)
    A = []
    B = []
    for _ in range(M):
        a, b = list(map(int, input().split()))
        a = a - 1
        b = b - 1
        A.append(a)
        B.append(b)
        graph[a][b] = True
        graph[b][a] = True
    # print(graph)
    ans = 0
    for i in range(M):
        # 辺を削除
        graph[A[i]][B[i]] = False
        graph[B[i]][A[i]] = False
        visited = [False] * N
        # 常に0番目の頂点から出発
        dfs(0, graph, visited, N)
        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)


if __name__ == "__main__":
    main()

def main():
    N, M = list(map(int, input().split()))
    AB = []
    for _ in range(M):
        a, b = list(map(int, input().split()))
        AB.append([a - 1, b - 1])
    # グラフを表現する（辺のある・なし）
    graph = []
    for _ in range(N):
        graph.append([False] * N)
    for a, b in AB:
        graph[a][b] = True
        graph[b][a] = True
    visited = [False] * N

    def dfs(v):
        """v（頂点）からスタートする"""
        # 到達済みだったらreturn
        if visited[v]:
            return
        # 到達した印
        visited[v] = True
        # そのさきへ（vと繋がっている）
        edges = graph[v]
        for i, e in enumerate(edges):
            if e:
                dfs(i)
        return

    ans = 0
    # 辺を一つずつ消してみて、橋かどうかを調べる
    for a, b in AB:
        graph[a][b] = False
        graph[b][a] = False
        visited = [False] * N
        dfs(0)
        # 全てTrueというわけではない（Falseが一つでもある場合）
        if not all(visited):
            ans += 1
        graph[a][b] = True
        graph[b][a] = True
    print(ans)


if __name__ == "__main__":
    main()

-""" -解説PDFを見ながら実装 -https://img.atcoder.jp/abc075/editorial.pdf -""" - - -def dfs(v, graph, visited, n): -    # 出発点 -    visited[v] = True -    for i in range(n): -        # 辺がない -        if graph[v][i] == False: -            continue -        # 訪問済み -        if visited[i] == True: -            continue -        # 辺があったらそこから訪問する -        dfs(i, graph, visited, n) - - +    AB = [] +    for _ in range(M): +        a, b = list(map(int, input().split())) +        AB.append([a - 1, b - 1]) +    # グラフを表現する（辺のある・なし） -        row = [False] * N -        graph.append(row) -    A = [] -    B = [] -    for _ in range(M): -        a, b = list(map(int, input().split())) -        a = a - 1 -        b = b - 1 -        A.append(a) -        B.append(b) +        graph.append([False] * N) +    for a, b in AB: -    # print(graph) +    visited = [False] * N + +    def dfs(v): +        """v（頂点）からスタートする""" +        # 到達済みだったらreturn +        if visited[v]: +            return +        # 到達した印 +        visited[v] = True +        # そのさきへ（vと繋がっている） +        edges = graph[v] +        for i, e in enumerate(edges): +            if e: +                dfs(i) +        return + -    for i in range(M): -        # 辺を削除 -        graph[A[i]][B[i]] = False -        graph[B[i]][A[i]] = False +    # 辺を一つずつ消してみて、橋かどうかを調べる +    for a, b in AB: +        graph[a][b] = False +        graph[b][a] = False -        # 常に0番目の頂点から出発 -        dfs(0, graph, visited, N) -        bridge = False -        for j in range(N): -            if visited[j] == False: -                bridge = True -        if bridge: +        dfs(0) +        # 全てTrueというわけではない（Falseが一つでもある場合） +        if not all(visited): -        # 辺を戻す -        graph[A[i]][B[i]] = True -        graph[B[i]][A[i]] = True +        graph[a][b] = True +        graph[b][a] = True