#include <iostream>
#include <climits>
using namespace std;
struct edge{
int nxt,to;
};
int n,m,Max,Min,a,b;
int head[100005],tot;
bool vis[100005];
edge g[200005];
void add(int u,int v){
g[++tot].to=v;
g[tot].nxt=head[u];
head[u]=tot;
g[++tot].to=u;
g[tot].nxt=head[v];
head[v]=tot;
}
void dfs(int u,bool f){
if (f) a++;
else b++;
for (int i=head[u];i;i=g[i].nxt){
if (vis[g[i].to]) continue;
vis[g[i].to]=true;
dfs(g[i].to,!f);
}
}
int main (){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> n >> m;
for (int i=1,u,v;i<=m;i++){
cin >> u >> v;
add(u,v);
}
for (int i=1;i<=n;i++){
a=b=0;
if (!vis[i]){
vis[i]=true;
dfs(i,0);
Max+=max(a,b),Min+=min(a,b);
}
}
cout << Min << ' ' << Max;
return 0;
}