import java.util.*


// グラフの中から，取り除くとグラフがサブグラフに分割されるようなエッジの本数を求める


// 思考
// エッジを一つずつ削って，全部のノードにたどり着けるか確認する？？
// O(E^2) の計算量になるか？
// 辺の数は 最大50本 -> 行けそう
// もっと効率的に求める方法もありそうだがとりあえず

// 探索方法
// ・全域木を作成する
// ・UnionFind Tree を作る？？が良いかも？？ 親子ではなく，循環が発生するかもしれないから面倒？？
// ツリーを作り直すのは面倒か？？　一旦全域探索をする方針で行く


// ノード１から順にグループにノードを追加
// 追加時に，自身を含めた，つながる事のできるノード 別配列に管理
// つながる事のできるものを順次追加していく？


// 計算量的には？？ E^2


fun main(args: Array<String>) {
    val (n, m) = readLine()!!.split(" ").map { it.toInt() }
    val nodes = Array(n) { mutableListOf<Int>() }

    // 無向グラフの隣接リストを作成
    for (i in 0 until m) {
        val (a, b) = readLine()!!.split(" ").map { it.toInt() }
        nodes[a - 1].add(b - 1)
        nodes[b - 1].add(a - 1)
    }

    // 配列のコピーを作成し，エッジを一つ削除し，判定 を繰り返す
    var cnt = 0
    for (i in 0 until nodes.size) {
        for ( j in 0 until nodes[i].size) {
            var tmp = Array(n) {i: Int -> nodes[i].toMutableList()}
            tmp[i].removeAt(j)
            if (!isConnected(tmp)){
               cnt += 1
            }
        }
    }

    print(cnt)
}

fun isConnected(nodes: Array<MutableList<Int>>): Boolean {

    var cur = 0
    var visited = mutableListOf(0)
    val next: Queue<Int> = ArrayDeque<Int>()
    next.addAll(nodes[0])

    while (!next.isEmpty()) {
        cur = next.poll()!!
        if (!visited.contains(cur)) {
            visited.add(cur)
            next.addAll(nodes[cur].filter { !visited.contains(it) })
        }
        if (visited.size == nodes.size) {
            return true
        }
    }
    return false
}