#include<bits/stdc++.h>
using namespace std;
const int nn=5e5+5;
int n,m,in[nn],head[nn],nxt[nn],cnt,bfin[nn];
struct node{
int u,v;
}edge[nn];
void add(int u,int v){
cnt++;
edge[cnt].u=u,edge[cnt].v=v;
nxt[cnt]=head[u];
head[u]=cnt;
in[v]++;
bfin[v]++;
}
priority_queue<int> q;
set<int> s;
int main(){
cin.tie(0),cout.tie(0),ios::sync_with_stdio(0);
cin>>n>>m;
for(int i=1;i<=m;i++){
int u,v;
cin>>u>>v;
add(u,v);
}
for(int i=1;i<=n;i++){
if(in[i]==0) q.push(-i);
}
int ans1=0,maxn=0;
for(int i=1;i<=n;i++){
int u=-q.top();
q.pop();
if(u>maxn){
maxn=u;
ans1++;
}
for(int j=head[u];j;j=nxt[j]){
int v=edge[j].v;
in[v]--;
if(in[v]==0) q.push(-v);
}
}
cout<<ans1<<endl;
for(int i=1;i<=n;i++){
in[i]=bfin[i];
if(in[i]==0) s.insert(i);
}
int ans2=0;
maxn=0;
for(int i=1;i<=n;i++){
int u1=*s.begin(),u2=*s.end(),u;
if(u1<maxn) u=u1;
else u=u2;
if(u>maxn){
ans2++;
maxn=u;
}
s.erase(u);
for(int j=head[u];j;j=nxt[j]){
int v=edge[j].v;
in[v]--;
if(in[v]==0) s.insert(v);
}
}
cout<<ans2<<endl;
return 0;
}