/*
TASK: zala
LANG: C++
*/
# include <stdio.h>
# define MAXM (1<<16)
# define MAXN (1<<20)

int n,m,fp,pr[MAXN],ans;
int queue[MAXN],used[MAXN];
struct node {
    int y,next;       
} data[MAXM];

void add(int a,int b) {
     data[fp].y = b;
     data[fp].next = pr[a];
     pr[a] = fp++;     
}

void read() {
    int a,b; 
    fp = 1;
    scanf("%d %d", &n,&m);
    for(int i = 0; i < m; i++) {
        scanf("%d %d", &a,&b);
        a++;
        b++;
        add(a,b);
        add(b,a);        
    }
    //for(int i = 0; i<=n; i++) printf("%d ", pr[i]);      
}

void bfs(int current) {
    int start = 0,end=1,level=1;
    for(int i = 0; i <= n; i++) used[i] = 0;
    used[current] = 1;
    queue[0] = data[pr[current]].y;
    used[data[pr[current]].y] = 1;           
    while(end > start) {
        for(int i = start; i < level; i++) {
            int p = pr[queue[i]];
            while(p > 0) {
                if(used[data[p].y] == 0) {
                    queue[end++] = data[p].y;
                    used[data[p].y] = 1;                                  
                }
                p = data[p].next;             
            }            
        }
        start = level;
        level = end;                    
    }
    if(end < n-1) ans++;

}

void work() {
     for(int i = 1; i<= n; i++) {
         bfs(i);            
     }    
     printf("%d\n", ans);     
}

int main() {
    read();
    work();
           
    return 0;
}
