Problem:
Score : 300 points

Problem Statement

You are given an undirected connected graph with N vertices and M edges that does not contain self-loops and double edges.

The i-th edge (1 \leq i \leq M) connects Vertex a_i and Vertex b_i.

An edge whose removal disconnects the graph is called a bridge.

Find the number of the edges that are bridges among the M edges.

Notes

A self-loop is an edge i such that a_i=b_i (1 \leq i \leq M).

Double edges are a pair of edges i,j such that a_i=a_j and b_i=b_j (1 \leq i<j \leq M).

An undirected graph is said to be connected when there exists a path between every pair of vertices.

Constraints

2 \leq N \leq 50

N-1 \leq M \leq min(N(N−1)⁄2,50)

1 \leq a_i<b_i \leq N

The given graph does not contain self-loops and double edges.

The given graph is connected.

Input

Input is given from Standard Input in the following format:

N M
a_1 b_1
a_2 b_2
:
a_M b_M

Output

Print the number of the edges that are bridges among the M edges.

Sample Input 1

7 7
1 3
2 7
3 4
4 5
4 6
5 6
6 7

Sample Output 1

4

The figure below shows the given graph:

The edges shown in red are bridges. There are four of them.

Sample Input 2

3 3
1 2
1 3
2 3

Sample Output 2

0

It is possible that there is no bridge.

Sample Input 3

6 5
1 2
2 3
3 4
4 5
5 6

Sample Output 3

5

It is possible that every edge is a bridge.

Solution in Fortran (GNU Fortran 9.2.1) (judge verdict: Wrong Answer)

program prob5
    implicit none
    integer, allocatable::c(:,:), dist(:), cnt(:), ct(:,:), disted(:), ans(:,:)
    integer::n, m, i, j, k, a, b
    read(*,*) n, m
    allocate(c(n,n),dist(n),cnt(n),ct(n,n),disted(n),ans(n,n))
    c = 0
    do i = 1, m
        read(*,*) a, b
        c(a,b) = 1
        c(b,a) = 1
    end do
    ans = c
    do i = 1, n
        dist = 0
        disted = 0
        disted(i) = 1
        cnt = 0
        ct = c
        do j = 1, n
            if(ct(i,j) == 1) then
                dist(j) = 1
                cnt(j) = 1
                ct(i,j) = 0
                ct(j,i) = 0
                disted(j) = 1
            end if
        end do
        do while(sum(ct) > 0)
            do j = 1, n
                if(dist(j) == 1) then
                    do k = 1, n
                        if(ct(j,k) == 1) then
                            dist(k) = 1
                            if(cnt(k) > 0) then
                                ans(j,k) = 0
                                ans(k,j) = 0
                            end if
                            disted(k) = 1
                            cnt(k) = cnt(k) + 1
                            ct(j,k) = 0
                            ct(k,j) = 0
                        end if
                    end do
                end if
                dist(j) = 0
            end do
        end do
    end do
    write(*,*) sum(ans)/2
    stop
end program