#include <bits/stdc++.h>
typedef long long ll;
using namespace std;

const int INF = 1e9;
const int MOD = 1e9+7;
const ll LINF = 1e18;

#define FOR(i,a,b) for(int i=(a);i<(b);++i)
#define REP(i,n) for(int i=0;i<(n);++i)
#define COUT(x) cout<<(x)<<"\n"

int main(){
    int n,m;
    cin >> n >> m;
    vector<vector<int>> root(n);
    int a,b;
    REP(i,m){
        cin >> a >> b;
        --a;--b;
        root[a].push_back(b);
        root[b].push_back(a);
    }
    //橋が存在＝（道が一個しかないところ（小島））から1回転移して、
    //その時の転移した島が,転移する前の島とそのほかの島1つに転移できる場合
    //その島は橋を形成している。
    
    queue<int> que;
    set<int> counted;
    int count = 0;
    REP(i,n){
        if(root[i].size()==1){
            count++;
            que.push(root[i][0]);
            counted.push_back(i);
        }
    }
    while(!que.empty()){
        int num = que.front();
        que.pop();
        for(int x:room[num]){
            for(auto y:counted){
                if(x==y)
            }
        }
    }
    COUT(count);
    return 0;
}  