#include<cstdio>
#include<vector>
using namespace std;
const int N = 10005;
int n, m, cut, bridge, t, d[N], low[N];
vector<vector<int> > g;
void enter() {
scanf("%d%d",&n,&m); g.resize(n);
for(int i = 0; i < m; ++i) {
int u, v; scanf("%d%d",&u,&v);
g[--u].push_back(--v);
g[v].push_back(u);
}
}
void dfs(int u, int p) {
low[u] = d[u] = ++t; int iscut = 0, nchild = 0;
for(vector<int>::iterator v = g[u].begin(); v != g[u].end(); ++v)
if(d[*v] == 0) {
++nchild; dfs(*v, u); low[u] = min(low[u], low[*v]);
if(low[*v] >= d[u] && p != -1 || nchild == 2 && p == -1) iscut = 1;
if(low[*v] >= d[*v]) ++bridge;
} else if(*v != p) low[u] = min(low[u], d[*v]);
cut += iscut;
}
void solve() {
for(int u = 0; u < n; ++u) if(d[u] == 0) dfs(u, -1);
printf("%d %d\n", cut, bridge);
}
int main() {
enter();
solve();
return 0;
}
I2luY2x1ZGU8Y3N0ZGlvPgojaW5jbHVkZTx2ZWN0b3I+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiAKY29uc3QgaW50IE4gPSAxMDAwNTsKaW50IG4sIG0sIGN1dCwgYnJpZGdlLCB0LCBkW05dLCBsb3dbTl07CnZlY3Rvcjx2ZWN0b3I8aW50PiA+IGc7CiAKdm9pZCBlbnRlcigpIHsKCXNjYW5mKCIlZCVkIiwmbiwmbSk7IGcucmVzaXplKG4pOwoJZm9yKGludCBpID0gMDsgaSA8IG07ICsraSkgewoJCWludCB1LCB2OyBzY2FuZigiJWQlZCIsJnUsJnYpOwoJCWdbLS11XS5wdXNoX2JhY2soLS12KTsKCQlnW3ZdLnB1c2hfYmFjayh1KTsKCX0KfQogCnZvaWQgZGZzKGludCB1LCBpbnQgcCkgewoJbG93W3VdID0gZFt1XSA9ICsrdDsgaW50IGlzY3V0ID0gMCwgbmNoaWxkID0gMDsKCWZvcih2ZWN0b3I8aW50Pjo6aXRlcmF0b3IgdiA9IGdbdV0uYmVnaW4oKTsgdiAhPSBnW3VdLmVuZCgpOyArK3YpIAoJCWlmKGRbKnZdID09IDApIHsKCQkJKytuY2hpbGQ7IGRmcygqdiwgdSk7IGxvd1t1XSA9IG1pbihsb3dbdV0sIGxvd1sqdl0pOwoJCQlpZihsb3dbKnZdID49IGRbdV0gJiYgcCAhPSAtMSB8fCBuY2hpbGQgPT0gMiAmJiBwID09IC0xKSBpc2N1dCA9IDE7CgkJCWlmKGxvd1sqdl0gPj0gZFsqdl0pICsrYnJpZGdlOwoJCX0gZWxzZSBpZigqdiAhPSBwKSBsb3dbdV0gPSBtaW4obG93W3VdLCBkWyp2XSk7CgljdXQgKz0gaXNjdXQ7Cn0KIAp2b2lkIHNvbHZlKCkgewoJZm9yKGludCB1ID0gMDsgdSA8IG47ICsrdSkgaWYoZFt1XSA9PSAwKSBkZnModSwgLTEpOwoJcHJpbnRmKCIlZCAlZFxuIiwgY3V0LCBicmlkZ2UpOwp9CiAKaW50IG1haW4oKSB7CgllbnRlcigpOwoJc29sdmUoKTsKCXJldHVybiAwOwp9