#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<vector>
using namespace std;
#define N 103
vector<int> g[N];
int n, low[N], dfn[N], f[N];
bool vis[N];
void dfs(int u, int depth, const int &root) { //root为连通图的树根
dfn[u] = low[u] = depth;
vis[u] = true;
int cnt = 0;
for (int i=0; i<g[u].size(); i++) {
int v = g[u][i];
if (!vis[v]) {
cnt++;
dfs(v, depth+1, root);
low[u] = min(low[u], low[v]);
if (u!=root && low[v]>=dfn[u]) f[u]++; //当u不为树根的时候
if (u==root && cnt>=2) f[u]++; //当u为搜索树的树根的时候
} else low[u] = min(low[u], dfn[v]);
}
}
int cut_point() {
memset(f, 0, sizeof(f));
memset(vis, false, sizeof(vis));
dfs(1, 1, 1);//认为原来是连通图
int ans = 0;
for (int i=1; i<=n; i++) if (f[i] >= 1) ans++;
return ans;
}
int m;
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
int i,j;
int ta,tb;
for(i=1;i<=n;i++)
g[i].clear();
for(i=1;i<=m;i++)
{
scanf("%d%d",&ta,&tb);
g[ta].push_back(tb);
g[tb].push_back(ta);
}
int ans;
ans=cut_point();
printf("%d\n",ans);
}
return 0;
}