#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> ii;
const int INF = 1e9;
const ll LINF = 1e18;
const int N = 1e4 + 5;
int n, m;
vector<int> adj[N];
int timer;
int tin[N]; // tin[u] = thời gian mà dfs đi vào đỉnh u
int low[N]; // low[u] = giá trị tin[v] của đỉnh v có tin[v] nhỏ nhất mà u đến được và chỉ sử dụng tối đa 1 cạnh ngược
int cnt_cutpoint; // Số đỉnh khớp
int cnt_bridge; // Số cạnh cầu
void dfs(int u, int p) {
tin[u] = low[u] = ++timer;
int child = 0; // Số đỉnh con của u trên cây dfs
bool is_cutpoint = false;
for (int v : adj[u]) {
if (v == p) continue;
if (!tin[v]) {
// (u, v) là cạnh của cây dfs
child++;
dfs(v, u);
low[u] = min(low[u], low[v]);
if (low[v] > tin[u]) cnt_bridge++;
if (low[v] >= tin[u] && p != -1) is_cutpoint = true; // trường hợp u không phải nút gốc của cây dfs
}
else {
// (u, v) là cạnh ngược
low[u] = min(low[u], tin[v]);
}
}
if (p == -1) { // trường hợp u là nút gốc của cây dfs
is_cutpoint = (child >= 2);
}
cnt_cutpoint += is_cutpoint;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n >> m;
for (int i = 0; i < m; i++) {
int u, v;
cin >> u >> v;
adj[u].push_back(v);
adj[v].push_back(u);
}
timer = 0;
cnt_cutpoint = cnt_bridge = 0;
for (int u = 1; u <= n; u++) {
if (!tin[u]) dfs(u, -1);
}
cout << cnt_cutpoint << ' ' << cnt_bridge << '\n';
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+IAoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsgIAoKdHlwZWRlZiBsb25nIGxvbmcgbGw7ICAKdHlwZWRlZiBwYWlyPGludCwgaW50PiBpaTsgIAoKY29uc3QgaW50IElORiA9IDFlOTsgIApjb25zdCBsbCBMSU5GID0gMWUxODsgIAoKY29uc3QgaW50IE4gPSAxZTQgKyA1OyAKCmludCBuLCBtOyAgCnZlY3RvcjxpbnQ+IGFkaltOXTsgCgppbnQgdGltZXI7CmludCB0aW5bTl07IC8vIHRpblt1XSA9IHRo4budaSBnaWFuIG3DoCBkZnMgxJFpIHbDoG8gxJHhu4luaCB1CmludCBsb3dbTl07IC8vIGxvd1t1XSA9IGdpw6EgdHLhu4sgdGluW3ZdIGPhu6dhIMSR4buJbmggdiBjw7MgdGluW3ZdIG5o4buPIG5o4bqldCBtw6AgdSDEkeG6v24gxJHGsOG7o2MgdsOgIGNo4buJIHPhu60gZOG7pW5nIHThu5FpIMSRYSAxIGPhuqFuaCBuZ8aw4bujYyAKaW50IGNudF9jdXRwb2ludDsgLy8gU+G7kSDEkeG7iW5oIGto4bubcAppbnQgY250X2JyaWRnZTsgLy8gU+G7kSBj4bqhbmggY+G6p3UKCnZvaWQgZGZzKGludCB1LCBpbnQgcCkgewoJdGluW3VdID0gbG93W3VdID0gKyt0aW1lcjsgCgkKCWludCBjaGlsZCA9IDA7IC8vIFPhu5EgxJHhu4luaCBjb24gY+G7p2EgdSB0csOqbiBjw6J5IGRmcwoJYm9vbCBpc19jdXRwb2ludCA9IGZhbHNlOyAKCWZvciAoaW50IHYgOiBhZGpbdV0pIHsKCQlpZiAodiA9PSBwKSBjb250aW51ZTsgCgkJaWYgKCF0aW5bdl0pIHsKCQkJLy8gKHUsIHYpIGzDoCBj4bqhbmggY+G7p2EgY8OieSBkZnMKCQkJY2hpbGQrKzsgCgkJCWRmcyh2LCB1KTsgCgkJCWxvd1t1XSA9IG1pbihsb3dbdV0sIGxvd1t2XSk7ICAKCQkJaWYgKGxvd1t2XSA+IHRpblt1XSkgY250X2JyaWRnZSsrOyAKCQkJaWYgKGxvd1t2XSA+PSB0aW5bdV0gJiYgcCAhPSAtMSkgaXNfY3V0cG9pbnQgPSB0cnVlOyAvLyB0csaw4budbmcgaOG7o3AgdSBraMO0bmcgcGjhuqNpIG7DunQgZ+G7kWMgY+G7p2EgY8OieSBkZnMgIAoJCX0KCQllbHNlIHsKCQkJLy8gKHUsIHYpIGzDoCBj4bqhbmggbmfGsOG7o2MgCgkJCWxvd1t1XSA9IG1pbihsb3dbdV0sIHRpblt2XSk7IAoJCX0KCX0KCglpZiAocCA9PSAtMSkgeyAvLyB0csaw4budbmcgaOG7o3AgdSBsw6AgbsO6dCBn4buRYyBj4bunYSBjw6J5IGRmcwoJCWlzX2N1dHBvaW50ID0gKGNoaWxkID49IDIpOyAKCX0KCgljbnRfY3V0cG9pbnQgKz0gaXNfY3V0cG9pbnQ7IAp9CgppbnQgbWFpbigpIHsKCWlvczo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsgCgljaW4udGllKG51bGxwdHIpOyAJCgljaW4gPj4gbiA+PiBtOyAKCWZvciAoaW50IGkgPSAwOyBpIDwgbTsgaSsrKSB7CgkJaW50IHUsIHY7IAoJCWNpbiA+PiB1ID4+IHY7IAoJCWFkalt1XS5wdXNoX2JhY2sodik7IAoJCWFkalt2XS5wdXNoX2JhY2sodSk7IAoJfQoKCXRpbWVyID0gMDsgIAoJY250X2N1dHBvaW50ID0gY250X2JyaWRnZSA9IDA7ICAKCWZvciAoaW50IHUgPSAxOyB1IDw9IG47IHUrKykgewoJCWlmICghdGluW3VdKSBkZnModSwgLTEpOyAKCX0KCgljb3V0IDw8IGNudF9jdXRwb2ludCA8PCAnICcgPDwgY250X2JyaWRnZSA8PCAnXG4nOyAJCn0=