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: Wrong Answer)

import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Deque;
import java.util.Scanner;

public class Main {
	public static void main(String[]args) {
		try(Scanner scan = new Scanner(System.in)){
			int N = scan.nextInt();
			int M = scan.nextInt();
			int[]a = new int[M];
			int[]b = new int[M];
			GM[]map = new GM[N];
			for(int i = 0;i<N;i++)map[i] = new GM(i+1);
			
			for(int i = 0;i<M;i++) {
				a[i] = scan.nextInt();
				b[i] = scan.nextInt();
				map[a[i]-1].hen.add(b[i]);
				map[b[i]-1].hen.add(a[i]);
			}
			
			Deque<GM>que = new ArrayDeque<GM>();
			que.addFirst(map[0]);
			map[0].se = true;
			map[0].kyori = 0;
			map[0].senzo .add(1);
			
			int dis = 0;
			
			while(!que.isEmpty()) {
				GM p = que.removeLast();
				for(Integer num:p.hen) {
					if(map[num-1].se==false) {
						map[num-1].kyori = p.kyori+1;
						map[num-1].se=true;
						map[num-1].sen=p.num;
						map[num-1].senzo.addAll(p.senzo);
						map[num-1].senzo.add(num);
						que.addFirst(map[num-1]);
					}else if(map[num-1].se==true&&map[num-1].num!=p.sen) {
						//System.out.println(p.num+" "+map[num-1].num);
						//System.out.println();
						
							for(int i = 0;i<Math.min(p.senzo.size(), map[num-1].senzo.size());i++) {
								
								if(p.senzo.get(i)!=map[num-1].senzo.get(i)) {
									int k = p.senzo.get(i-1);
									//System.out.println(p.senzo.get(i-1));
									dis+=map[num-1].kyori-map[k-1].kyori;
									//System.out.println(dis);
									dis+=p.kyori-map[k-1].kyori;
									//System.out.println(dis);
									dis++;
									//System.out.println(dis);
									break;
								}
								
								
								
							}
						
						
						
					}
				}
				
			}
			
			dis/=2;
			
			/*
			for(int i = 0;i<N;i++) {
				System.out.print(map[i].sen+" ");
				System.out.print("map["+(i+1)+"]");
				System.out.print(" 深さ ");
				System.out.print(map[i].kyori);
				System.out.print(" 先祖たち");
				for(Integer s:map[i].senzo) {
					System.out.print(s);
					System.out.print(" ");
				}
				System.out.println();
			}*/
			
			
			System.out.println(M-dis);
			
			
			
			
			
			
			
			
			
			
			
			
		}
		
		
	}
	
	static class GM{
		int num ;
		boolean se=false;
		int sen=-1;
		ArrayList<Integer>hen = new ArrayList<Integer>();
		ArrayList<Integer>senzo = new ArrayList<Integer>();
		int kyori=-1;
		
		GM(int n){
			num = n;
		}
		
	}
	


}