#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int n,m,x,y,rd[N],cd[N],ans;
vector<int> e[N];
int t,dfn[N],low[N],scc[N],siz[N],cnt;
bool vis[N];
stack<int> s;
void dfs(int k){
dfn[k]=low[k]=++t;
s.push(k);vis[k]=1;
for(int i=0;i<e[k].size();i++){
int v=e[k][i];
if(dfn[v]==0){
dfs(v);
low[k]=min(low[k],low[v]);
}
else if(vis[k]==1)
low[k]=min(low[k],low[v]);
}
if(dfn[k]==low[k]){
cnt++;
while(s.top()!=k){
int tmp=s.top();s.pop();
scc[tmp]=cnt,vis[tmp]=0,siz[cnt]++;
}
s.pop();
scc[k]=cnt,vis[k]=0,siz[cnt]++;
}
}
int main(){
cin>>n>>m;
for(int i=1;i<=m;i++){
scanf("%d%d",&x,&y);
e[x].push_back(y);
}
for(int i=1;i<=n;i++)
if(dfn[i]==0)
dfs(i);
for(int i=1;i<=cnt;i++)
ans=max(ans,siz[i]);
cout<<ans<<endl;
for(int i=1;i<=n;i++)
for(int j=0;j<e[i].size();j++){
x=scc[i],y=scc[e[i][j]];
if(x!=y)
cd[x]++,rd[y]++;
}
x=0,y=0;
for(int i=1;i<=cnt;i++){
if(rd[i]==0)
x++;
if(cd[i]==0)
y++;
}
ans=max(x,y);
if(siz[1]==n)
cout<<0;
else
cout<<ans;
return 0;
}