#include <bits/stdc++.h>
using namespace std;
const int maxN = 10010;
int n, m;
bool khop[maxN];
int timeDfs = 0, bridge = 0;
int low[maxN], num[maxN];
vector <int> g[maxN];
/// dinh u ma chua dfs toi : num[u] = 0, low[u] = 0;
///
void dfs(int u, int p) {
int child = 0; // Số lượng con trực tiếp của đỉnh u trong cây DFS
num[u] = low[u] = ++timeDfs;
/// num[u] : số thứ tự mà đỉnh u được dfs tới
/// low[u] = num[v] với v là đỉnh sở hữu num[v] nhỏ nhất sao cho u có thể tới v thông qua quá trình dfs
for (int v : g[u]) {
if (v == p) continue;
if (!num[v]) {
dfs(v, u);
/// khi này ta sẽ biết được low[v]
low[u] = min(low[u], low[v]);
/// thằng v vươn tới đâu thì u cũng có thể vươn tới đó
if (low[v] == num[v]) {
/// cạnh u - v là cầu
/// bởi vì v ko thể tìm được chỗ khác để nối tới
/// khi mà bị mất đi cạnh u - v
bridge++;
}
child++;
/// child tại đỉnh u đóng vai trò là số lần
/// dfs tới các đỉnh con
/// u = pre = 1
/// num[1] = 1
/// đẫn tới low[v] >= num[1] hiển nhiên sẽ xảy ra
/// nên ta phải xét riêng trường hợp này
if (u == p) { // Nếu u là đỉnh gốc của cây DFS
if (child >= 2) khop[u] = true;
}
else
if (low[v] >= num[u]) khop[u] = true;
}
else if (num[v] != 0) {
/// em đang đỉnh u
/// low[u]
/// e có thể vươn tới đỉnh v mà đỉnh v nó đã được gán low[v], num[v] trước đó
/// suy ra v được dfs tới trước u
/// suy ra nó là cung ngược
low[u] = min(low[u], num[v]);
}
}
}
int main() {
cin >> n >> m;
for (int i = 1; i <= m; i++) {
int u, v;
cin >> u >> v;
g[u].push_back(v);
g[v].push_back(u);
}
dfs(1, 1);
for (int i = 1; i <= n; i++)
if (!num[i]) dfs(i, i);
int cntJoint = 0;
for (int i = 1; i <= n; i++) cntJoint += khop[i];
cout << cntJoint << ' ' << bridge;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY29uc3QgaW50IG1heE4gPSAxMDAxMDsKCmludCBuLCBtOwpib29sIGtob3BbbWF4Tl07CmludCB0aW1lRGZzID0gMCwgYnJpZGdlID0gMDsKaW50IGxvd1ttYXhOXSwgbnVtW21heE5dOwp2ZWN0b3IgPGludD4gZ1ttYXhOXTsKCgovLy8gZGluaCB1IG1hIGNodWEgZGZzIHRvaSA6IG51bVt1XSA9IDAsIGxvd1t1XSA9IDA7CgovLy8KCnZvaWQgZGZzKGludCB1LCBpbnQgcCkgewogICAgaW50IGNoaWxkID0gMDsgLy8gU+G7kSBsxrDhu6NuZyBjb24gdHLhu7FjIHRp4bq/cCBj4bunYSDEkeG7iW5oIHUgdHJvbmcgY8OieSBERlMKICAgIG51bVt1XSA9IGxvd1t1XSA9ICsrdGltZURmczsKCiAgICAvLy8gbnVtW3VdIDogc+G7kSB0aOG7qSB04buxIG3DoCDEkeG7iW5oIHUgxJHGsOG7o2MgZGZzIHThu5tpCiAgICAvLy8gbG93W3VdID0gbnVtW3ZdIHbhu5tpIHYgbMOgIMSR4buJbmggc+G7nyBo4buvdSBudW1bdl0gbmjhu48gbmjhuqV0IHNhbyBjaG8gdSBjw7MgdGjhu4MgdOG7m2kgdiB0aMO0bmcgcXVhIHF1w6EgdHLDrG5oIGRmcwoKICAgIGZvciAoaW50IHYgOiBnW3VdKSB7CiAgICAgICAgaWYgKHYgPT0gcCkgY29udGludWU7CiAgICAgICAgaWYgKCFudW1bdl0pIHsKCiAgICAgICAgICAgIGRmcyh2LCB1KTsKCiAgICAgICAgICAgIC8vLyBraGkgbsOgeSB0YSBz4bq9IGJp4bq/dCDEkcaw4bujYyBsb3dbdl0KCiAgICAgICAgICAgIGxvd1t1XSA9IG1pbihsb3dbdV0sIGxvd1t2XSk7CgogICAgICAgICAgICAvLy8gdGjhurFuZyB2IHbGsMahbiB04bubaSDEkcOidSB0aMOsIHUgY8WpbmcgY8OzIHRo4buDIHbGsMahbiB04bubaSDEkcOzCgoKICAgICAgICAgICAgaWYgKGxvd1t2XSA9PSBudW1bdl0pIHsKICAgICAgICAgICAgICAgIC8vLyBj4bqhbmggdSAtIHYgbMOgIGPhuqd1CgogICAgICAgICAgICAgICAgLy8vIGLhu59pIHbDrCB2IGtvIHRo4buDIHTDrG0gxJHGsOG7o2MgY2jhu5cga2jDoWMgxJHhu4MgbuG7kWkgdOG7m2kKCiAgICAgICAgICAgICAgICAvLy8ga2hpIG3DoCBi4buLIG3huqV0IMSRaSBj4bqhbmggdSAtIHYKICAgICAgICAgICAgICAgIGJyaWRnZSsrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNoaWxkKys7CgogICAgICAgICAgICAvLy8gY2hpbGQgdOG6oWkgxJHhu4luaCB1IMSRw7NuZyB2YWkgdHLDsiBsw6Agc+G7kSBs4bqnbgogICAgICAgICAgICAvLy8gZGZzIHThu5tpIGPDoWMgxJHhu4luaCBjb24KCgogICAgICAgICAgICAvLy8gdSA9IHByZSA9IDEKICAgICAgICAgICAgLy8vIG51bVsxXSA9IDEKICAgICAgICAgICAgLy8vIMSR4bqrbiB04bubaSBsb3dbdl0gPj0gbnVtWzFdIGhp4buDbiBuaGnDqm4gc+G6vSB44bqjeSByYQogICAgICAgICAgICAvLy8gbsOqbiB0YSBwaOG6o2kgeMOpdCByacOqbmcgdHLGsOG7nW5nIGjhu6NwIG7DoHkKCiAgICAgICAgICAgIGlmICh1ID09IHApIHsgLy8gTuG6v3UgdSBsw6AgxJHhu4luaCBn4buRYyBj4bunYSBjw6J5IERGUwogICAgICAgICAgICAgICAgaWYgKGNoaWxkID49IDIpIGtob3BbdV0gPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICBpZiAobG93W3ZdID49IG51bVt1XSkga2hvcFt1XSA9IHRydWU7CgogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChudW1bdl0gIT0gMCkgewoKCiAgICAgICAgICAgIC8vLyBlbSDEkWFuZyDEkeG7iW5oIHUKCiAgICAgICAgICAgIC8vLyBsb3dbdV0KCiAgICAgICAgICAgIC8vLyBlIGPDsyB0aOG7gyB2xrDGoW4gdOG7m2kgxJHhu4luaCB2IG3DoCDEkeG7iW5oIHYgbsOzIMSRw6MgxJHGsOG7o2MgZ8OhbiBsb3dbdl0sIG51bVt2XSB0csaw4bubYyDEkcOzCgogICAgICAgICAgICAvLy8gc3V5IHJhIHYgxJHGsOG7o2MgZGZzIHThu5tpIHRyxrDhu5tjIHUKCiAgICAgICAgICAgIC8vLyBzdXkgcmEgbsOzIGzDoCBjdW5nIG5nxrDhu6NjCiAgICAgICAgICAgIGxvd1t1XSA9IG1pbihsb3dbdV0sIG51bVt2XSk7CiAgICAgICAgfQogICAgfQp9CgppbnQgbWFpbigpIHsKICAgIGNpbiA+PiBuID4+IG07CiAgICBmb3IgKGludCBpID0gMTsgaSA8PSBtOyBpKyspIHsKICAgICAgICBpbnQgdSwgdjsKICAgICAgICBjaW4gPj4gdSA+PiB2OwogICAgICAgIGdbdV0ucHVzaF9iYWNrKHYpOwogICAgICAgIGdbdl0ucHVzaF9iYWNrKHUpOwogICAgfQoKICAgIGRmcygxLCAxKTsKCiAgICBmb3IgKGludCBpID0gMTsgaSA8PSBuOyBpKyspCiAgICAgICAgaWYgKCFudW1baV0pIGRmcyhpLCBpKTsKCiAgICBpbnQgY250Sm9pbnQgPSAwOwogICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgaSsrKSBjbnRKb2ludCArPSBraG9wW2ldOwoKICAgIGNvdXQgPDwgY250Sm9pbnQgPDwgJyAnIDw8IGJyaWRnZTsKfQo=