#include <iostream>
#include <vector>
using namespace std;
vector<int> parent;
int findRoot(int x) {
while (parent[x] != x) {
parent[x] = parent[parent[x]];
x = parent[x];
}
return x;
}
int main() {
int n, m;
cin >> n >> m;
parent.resize(n + 1);
for (int v = 1; v <= n; v++) parent[v] = v;
vector<int> a(m), b(m);
for (int i = 0; i < m; i++) {
cin >> a[i] >> b[i];
int ra = findRoot(a[i]), rb = findRoot(b[i]);
if (ra != rb) parent[ra] = rb;
}
vector<int> verts(n + 1, 0), edges(n + 1, 0);
for (int v = 1; v <= n; v++) verts[findRoot(v)]++;
for (int i = 0; i < m; i++) edges[findRoot(a[i])]++;
int components = 0, trees = 0;
for (int v = 1; v <= n; v++) {
if (findRoot(v) == v) {
components++;
if (edges[v] == verts[v] - 1) trees++;
}
}
cout << components << " " << trees << "\n";
return 0;
}