//用并查集将块缩成点
#include
< iostream >
#include
< vector >
using   namespace  std;
vector
< int > list[ 5001 ];   
int  low[ 5001 ];
int  d[ 5001 ],dep[ 5001 ];
int  color[ 5001 ];
int  n,m;
int  bridge[ 10001 ][ 2 ];
int  p[ 5001 ],rank[ 5001 ],cnt,tol,num = 0 ;
int  ncon,belong[ 5001 ];
void  Init()
{
    
int  i;
    
for (i = 1 ;i <= n;i ++ )
    {
        p[i]
= i;
        rank[i]
= 0 ;
    }
}
int  Find( int  x)
{
    
if (x != p[x])
        p[x]
= Find(p[x]);
    
return  p[x];
}
int  Union( int  x, int  y)
{
    
int  a = Find(x);
    
int  b = Find(y);
    
if (rank[a] > rank[b])
    {
        p[b]
= a;
    }
    
else
    {
        p[a]
= b;
        
if (rank[a] == rank[b])
        {
            rank[b]
++ ;
        }
    }
    
return   0 ;
}
int  DFS( int  u, int  fa, int  t)
{
    color[u]
= 1 ;
    dep[u]
= low[u] = t;
    tol
= 0 ;
    
int  tofa = 0 ;
    
int  i,v;
    
for (i = 0 ;i < list[u].size();i ++ )
    {
        v
= list[u][i];
        
if (color[v] == 0 )
        {
            DFS(v,u,t
+ 1 );
            tol
++ ;
            low[u]
= min(low[u],low[v]);
            
if (low[v] <= dep[u])
                Union(u,v);
            
if (low[v] > dep[u])
            {
                bridge[num][
0 ] = u;
                bridge[num
++ ][ 1 ] = v;
            }
        }
        
else   if (v != fa || tofa)
        {
            low[u]
= min(low[u],dep[v]);
        }
        
if (v == fa) tofa = 1

    }
    
return   0 ;
}
int  DC()
{
    
int  i;
    
for (i = 1 ;i <= n;i ++ )
    {
        belong[i]
=- 1 ;
    }
    
for (i = 1 ;i <= n;i ++ )
    {
        
int  k = Find(i);
        
if (belong[k] ==- 1 )
            belong[k]
=++ ncon;
        belong[i]
= belong[k];
    }
    
for (i = 0 ;i < num;i ++ )
    {
        d[belong[bridge[i][
0 ]]] ++ ;
        d[belong[bridge[i][
1 ]]] ++ ;
    }
    
for (i = 1 ;i <= ncon;i ++ )
    {
        
if (d[i] == 1 )
            cnt
++ ;
    }
    
return  (cnt + 1 ) / 2 ;

}
int  main()
{
    
while (scanf( " %d%d " , & n, & m) != EOF)
    {
        cnt
= 0 ;
        num
= 0 ;
        memset(list,
0 , sizeof (list));
        memset(d,
0 , sizeof (d));
        memset(dep,
0 , sizeof (dep));
        memset(low,
0 , sizeof (low));
        memset(color,
0 , sizeof (color));
        
int  a,b;
        
while (m -- )
        {
            scanf(
" %d%d " , & a, & b);
            list[a].push_back(b);
            list[b].push_back(a);
        }
        Init();
        
int  i;
        
for (i = 1 ;i <= n;i ++ )
        {
            
if ( ! color[i])
                DFS(i,
- 1 , 1 );
        }
        printf(
" %d\n " ,DC());
    }
    system(
" pause " );
    
return   0 ;
}