#include <bits/stdc++.h>
using namespace std;
const double eps = 1e-15;
const double Max = 1e+18;
inline void normal(long long& a) {
  a %= 1000000007;
  (a < 0) && (a += 1000000007);
}
inline long long mul(long long a, long long b) {
  a %= 1000000007, b %= 1000000007;
  normal(a), normal(b);
  return (a * b) % 1000000007;
}
inline long long add(long long a, long long b) {
  a %= 1000000007, b %= 1000000007;
  normal(a), normal(b);
  return (a + b) % 1000000007;
}
inline long long sub(long long a, long long b) {
  a %= 1000000007, b %= 1000000007;
  normal(a), normal(b);
  a -= b;
  normal(a);
  return a;
}
int val[100100], visited[100010];
vector<int> G[100010];
bool dfs(int idx, int par) {
  visited[idx] = 1;
  long long i, n = G[idx].size();
  bool ans = false;
  for (i = 0; i < n; i++) {
    if (visited[G[idx][i]] && G[idx][i] != par) ans = true;
    if (!visited[G[idx][i]]) ans = ans | dfs(G[idx][i], idx);
  }
  return ans;
}
int main() {
  ios::sync_with_stdio(false);
  long long n, m, i, j, k;
  cin >> n >> m;
  for (i = 0; i < m; i++) {
    cin >> j >> k;
    G[j].push_back(k);
    G[k].push_back(j);
  }
  long long ans = 0;
  for (i = 1; i <= n; i++) {
    if (!visited[i]) {
      if (!dfs(i, -1)) ans++;
    }
  }
  cout << ans << endl;
  return 0;
}
