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 Java8 (OpenJDK 1.8.0) (judge verdict: Accepted)

import java.util.Scanner;
import java.util.ArrayList;
import java.util.Arrays;
public class Main{
	static ArrayList<Integer>[] list;
	static boolean[] check;
	static int n;
	static int count;
	public static void main(String[] args){
		Scanner sc = new Scanner(System.in);
		n=sc.nextInt();
		int m=sc.nextInt();
		list=new ArrayList[n];
		check=new boolean[n];
		for(int i=0; i<n; i++){
			list[i]=new ArrayList<>();
		}
		int[][] ab=new int[m][2];
		for(int i=0; i<m; i++){
			int a=sc.nextInt()-1;
			int b=sc.nextInt()-1;
			list[a].add(b);
			list[b].add(a);
			ab[i][0]=a;
			ab[i][1]=b;
		}
		int ans=0;
		for(int i=0; i<m; i++){
			count=0;
			Arrays.fill(check,false);
			if(dfs(ab[i][0],ab[i][1],0)){
				ans++;
			}
		}
		System.out.println(ans);
	}
	static boolean dfs(int a,int b,int now){
		count++;
		if(count==n){
			return false;
		}
		check[now]=true;
		for(int i:list[now]){
			if(!check[i] && !(now==a && i==b) && !(now==b && i==a)){
				if(!dfs(a,b,i)){
					return false;
				}
			}
		}
		return true;
	}
}