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

edges=[list(map(int,input().split())) for i in range(M)]

ans=0

for x in edges:

    l=list(range(N))

    for y in edges:

        if y!=x:

          l=[l[y[0]-1]if l[i]==l[y[1]-1] else l[i] for i in range(N)]

    if len(set(l))!=1:

      ans+=1

print(ans)

class UnionFind:

    def __init__(self, n):

        self.nodes = n

        self.parents = [i for i in range(n)]

        self.sizes = [1] * n

        self.rank = [0] * n



    def find(self, i): # どの集合に属しているか（根ノードの番号）

        if self.parents[i] == i:

            return i

        else:

            self.parents[i] = self.find(self.parents[i]) # 経路圧縮

            return self.parents[i]



    def unite(self, i, j): # 二つの集合を併合

        pi = self.find(i)

        pj = self.find(j)

        if pi != pj:

            if self.rank[pi] < self.rank[pj]:

                self.sizes[pj] += self.sizes[pi]

                self.parents[pi] = pj

            else:

                self.sizes[pi] += self.sizes[pj]

                self.parents[pj] = pi

                if self.rank[pi] == self.rank[pj]:

                    self.rank[pi] += 1

    def same(self, i, j): # 同じ集合に属するかを判定

        return self.find(i)==self.find(j)



    def get_parents(self): # 根ノードの一覧を取得

        for n in range(self.nodes): # findで経路圧縮する

            self.find(n)

        return self.parents



adj = []

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

for m in range(M):

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

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



ans = 0

for i in range(M): # 取り除く辺番号

    uf = UnionFind(N)

    for j in range(M):

        if (i==j): # 辺を追加しない（取り除く）

            continue

        uf.unite(*adj[j])

    

    if len(set(uf.get_parents()))!=1: # 複数の集合にわかれているか確認

        ans += 1

print (ans)
N, M = list(map(int, input().split()))
edges = [list(map(int, input().split())) for i in range(M)]
ans = 0
for x in edges:
    l = list(range(N))
    for y in edges:
        if y != x:
            l = [l[y[0] - 1] if l[i] == l[y[1] - 1] else l[i] for i in range(N)]
    if len(set(l)) != 1:
        ans += 1
print(ans)

class UnionFind:
    def __init__(self, n):
        self.nodes = n
        self.parents = [i for i in range(n)]
        self.sizes = [1] * n
        self.rank = [0] * n

    def find(self, i):  # どの集合に属しているか（根ノードの番号）
        if self.parents[i] == i:
            return i
        else:
            self.parents[i] = self.find(self.parents[i])  # 経路圧縮
            return self.parents[i]

    def unite(self, i, j):  # 二つの集合を併合
        pi = self.find(i)
        pj = self.find(j)
        if pi != pj:
            if self.rank[pi] < self.rank[pj]:
                self.sizes[pj] += self.sizes[pi]
                self.parents[pi] = pj
            else:
                self.sizes[pi] += self.sizes[pj]
                self.parents[pj] = pi
                if self.rank[pi] == self.rank[pj]:
                    self.rank[pi] += 1

    def same(self, i, j):  # 同じ集合に属するかを判定
        return self.find(i) == self.find(j)

    def get_parents(self):  # 根ノードの一覧を取得
        for n in range(self.nodes):  # findで経路圧縮する
            self.find(n)
        return self.parents


adj = []
N, M = list(map(int, input().split()))
for m in range(M):
    a, b = list(map(int, input().split()))
    adj.append([a - 1, b - 1])
ans = 0
for i in range(M):  # 取り除く辺番号
    uf = UnionFind(N)
    for j in range(M):
        if i == j:  # 辺を追加しない（取り除く）
            continue
        uf.unite(*adj[j])
    if len(set(uf.get_parents())) != 1:  # 複数の集合にわかれているか確認
        ans += 1
print(ans)

+class UnionFind: +    def __init__(self, n): +        self.nodes = n +        self.parents = [i for i in range(n)] +        self.sizes = [1] * n +        self.rank = [0] * n + +    def find(self, i):  # どの集合に属しているか（根ノードの番号） +        if self.parents[i] == i: +            return i +        else: +            self.parents[i] = self.find(self.parents[i])  # 経路圧縮 +            return self.parents[i] + +    def unite(self, i, j):  # 二つの集合を併合 +        pi = self.find(i) +        pj = self.find(j) +        if pi != pj: +            if self.rank[pi] < self.rank[pj]: +                self.sizes[pj] += self.sizes[pi] +                self.parents[pi] = pj +            else: +                self.sizes[pi] += self.sizes[pj] +                self.parents[pj] = pi +                if self.rank[pi] == self.rank[pj]: +                    self.rank[pi] += 1 + +    def same(self, i, j):  # 同じ集合に属するかを判定 +        return self.find(i) == self.find(j) + +    def get_parents(self):  # 根ノードの一覧を取得 +        for n in range(self.nodes):  # findで経路圧縮する +            self.find(n) +        return self.parents + + +adj = [] -edges = [list(map(int, input().split())) for i in range(M)] +for m in range(M): +    a, b = list(map(int, input().split())) +    adj.append([a - 1, b - 1]) -for x in edges: -    l = list(range(N)) -    for y in edges: -        if y != x: -            l = [l[y[0] - 1] if l[i] == l[y[1] - 1] else l[i] for i in range(N)] -    if len(set(l)) != 1: +for i in range(M):  # 取り除く辺番号 +    uf = UnionFind(N) +    for j in range(M): +        if i == j:  # 辺を追加しない（取り除く） +            continue +        uf.unite(*adj[j]) +    if len(set(uf.get_parents())) != 1:  # 複数の集合にわかれているか確認