#include<bits/stdc++.h>
using namespace std;
const int MAXN=2e5+5;
int n, m;
struct Edge
{
int u, v, nxt;
}edge[MAXN*2];
int head[MAXN*2], cnt;
int in()
{
int k=0,f=1;
char c=getchar();
while(c<'0'||c>'9')
{
if(c=='-')f=-1;
c=getchar();
}
while(c>='0'&&c<='9')k=k*10+c-'0',c=getchar();
return k*f;
}
int add(int u, int v)
{
edge[++cnt]={u, v, head[u]};
head[u]=cnt;
}
int maxn=0, minn=0, ans1, ans2;
bool book[MAXN];
void dfs(int u, bool flag)
{
if(book[u]) return;
book[u]=1;
if(flag==0) ans1++, flag=1;
else if(flag==1) ans2++, flag=0;
for(int j=head[u]; j; j=edge[j].nxt)
{
int v=edge[j].v;
if(book[v]) continue;
dfs(v, flag);
}
}
int main()
{
n=in(), m=in();
for(int i=1; i<=m; i++)
{
int u=in(), v=in();
add(u, v);
add(v, u);
}
for(int i=1; i<=n; i++)
{
ans1=0, ans2=0;
if(!book[i])
{
dfs(i, 0);
maxn+=max(ans1, ans2);
minn+=min(ans1, ans2);
}
}
printf("%d %d", minn, maxn);
}