#include <bits/stdc++.h>
using namespace std;
struct Node
{
	int v;
	int id;
};
int n,m;
vector<vector<Node>> inp;
vector<int> low, num;
vector<bool> joint;
int times = 0;
int bridge = 0;



void dfs(int u, int par)
{
	low[u] = num[u] = ++times;
	int child = 0;
	for(Node v: inp[u])
	{
		int x = v.v;
		int id = v.id;
		if(id == par) continue;
		if(num[x] == 0)
		{
			dfs(x, id);
			child++;
			low[u] = min(low[u], low[x]);
			if(low[x] == num[x]) bridge++;
			if(par == -1)
			{
				if(child > 1) joint[u] = true;
			}
			else if(low[x] >= num[u]) joint[u] = true;
		}
		else low[u] = min(low[u], num[x]);
	}
}
int main()
{
	ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
	cin >> n >>m;
	inp.resize(n+1);
	low.resize(n+1);
	num.resize(n+1);
	joint.resize(n+1);
	for(int  i =1; i<=m; i++) 
	{
		int a,b; cin >> a >> b;
		inp[a].push_back({b, i});
		inp[b].push_back({a, i});
	}
	
	for(int i =1; i<=n; i++) if(num[i] == 0) dfs(i, -1);
	
	int khop =0;
	for(int i =1; i<=n; i++) khop += joint[i];
	
	cout << khop << " " << bridge;
	
	
	
	return 0;
}