#include<bits/stdc++.h>
using namespace std;
int n, m;
stack<int> s;
const int maxn = 5005;
const int maxm = 10005;
int cnt, head[maxn] ;
int dfn[maxn], low[maxn], timer ;
int bcc_cnt, bcc[maxn], deg[maxn] ;
struct node{
int to, next;
} G[maxm << 1] ;
void add(int u, int v){
++cnt;
G[cnt].to = v;
G[cnt].next = head[u];
head[u] = cnt;
}
void tarjan(int u, int fa){
dfn[u] = low[u] = ++timer;
s.push(u);
for (int i = head[u]; i; i = G[i].next){
int v = G[i].to;
if (dfn[v] == 0){
tarjan(v, u);
low[u] = min (low[u], low[v]);
}else if(v != fa) {
low[u] = min (low[u], dfn[v]);
}
}
if (low[u] == dfn[u]){
++bcc_cnt;
while (1) {
int x = s.top();
s.pop();
bcc[x] = bcc_cnt;
if (x == u) break;
}
}
}
int main (){
cin >> n >> m;
for (int i = 1; i <= m; i++ ){
int u, v;
cin >> u >> v;
add(u, v);
add(v, u);
}
for (int i = 1; i <= n ;i++){
if (dfn[i] == 0) tarjan(i, -1);
}
for (int u = 1; u <= n; u++){
for (int i = head[u]; i; i=G[i].next){
int v = G[i].to;
if (bcc[u] != bcc[v]) {
deg[bcc[u]]++;
}
}
}
int num = 0;
for (int i = 1; i <= bcc_cnt; i++){
if (deg[i] == 1) {
num++;
}
}
cout << (num + 1) / 2;
return 0;
}