#include <iostream>
#include <cstdio>
#include <vector>

using namespace std;

#define Max 10010

vector<int> Graph[Max];
int Low[Max],Num[Max],Padre_Nodo[Max];
bool Visi[Max];
int Act,Ans,Hijos_root,Root;

void DFS(int Padre){
	Low[Padre]=Num[Padre]=Act;
	Act++;
	Visi[Padre]=true;
	for(int i=0;i<Graph[Padre].size();i++){
		int Hijo=Graph[Padre][i];
		if(Visi[Hijo]==false){
			Padre_Nodo[Hijo]=Padre;
			DFS(Hijo);
			if(Padre==Root){
				Hijos_root++;
			}
			if(Low[Hijo]>=Num[Padre] && Padre!=Root){
				Ans++;
			}
			Low[Padre]=min(Low[Padre],Low[Hijo]);
		}else if(Padre_Nodo[Padre]!=Hijo && Padre!=Root){
			Low[Padre]=min(Low[Padre],Num[Hijo]);
		}
	}
}

int main(){
	int n,m,a,b;
	while(cin>>n>>m){
		if(n==m && m==0) break;
		for(int i=0;i<=n;i++){
			Graph[i].clear();
			Low[i]=0;
			Num[i]=0;
			Padre_Nodo[i]=-1;
			Visi[i]=false;
		}
		while(m--){
			cin>>a>>b;
			Graph[a].push_back(b);
			Graph[b].push_back(a);
		}
		Ans=0; Act=0;
		for(int i=1;i<=n;i++){
			if(Visi[i]==false){
				Root=i; Hijos_root=0;
				DFS(Root);
				if(Hijos_root>=2) Ans++;
			}
		}
		cout<<Ans<<endl;
	}
	return 0;
}