#include <stdio.h>
#include <algorithm>
#include <cstring>
#include <cctype>
#define lson k<<1
#define rson k<<1|1
#define mid (l+r)>>1
using namespace std;
const int maxn=1000200;
int l[maxn],L[maxn],n,m;int tot1,tot2;
int ru[maxn],que[maxn],w[maxn<<2];
int f[maxn],g[maxn];
struct node
{
int nex,ver;
} e[maxn],E[maxn];
int read()
{
int x=0,b=1;char c=getchar();
while(!isdigit(c)) b=c=='-'?-1:1,c=getchar();
while(isdigit(c)) x=x*10+c-'0',c=getchar();
return x*b;
}
void topsort()
{
int hh=1,tt=0;
for(int i=1;i<=n;i++) if(!ru[i]) que[++tt]=i;
while(hh<=tt)
{
int x=que[hh];
for(int i=l[x];i;i=e[i].nex)//½á¹¹ÌåÒÀ¾ÉÊÇ´æ±ß
{
if(--ru[e[i].ver]==0) que[++tt]=e[i].ver;
}
}
for(int i=1;i<=n;i++)
{
int x=que[i];
for(int i=l[x];i;i=e[i].nex) f[e[i].ver]=max(f[e[i].ver],f[x]+1);
}
for(int i=n;i>=1;i--)
{
int x=que[i];
for(int i=L[x];i;i=E[i].nex) g[E[i].ver]=max(g[E[i].ver],g[x]+1);
}
return;
}
void add(int x,int d,int k,int l,int r)
{
if(l==r)
{
w[k]+=d;return;
}
if(mid>=x) add(x,d,lson,l,mid);else add(x,d,rson,mid+1,r);
w[k]=w[lson]+w[rson];
return;
}
int ask(int k,int l,int r)
{
if(l==r) return l;
if(w[rson]) return ask(lson,l,mid);else return ask(rson,mid+1,r);
}
void push(int x){add(x,1,1,1,n);}
void pop(int x){add(x,-1,1,1,n);}
int main()
{
n=read();m=read();
for(int i=1;i<=m;i++)
{
int u,v;u=read();v=read();ru[v]++;
e[++tot1]=(node){l[u],v};l[u]=tot1;//zhuyi
E[++tot2]=(node){L[v],u};L[v]=tot2;
}
topsort();
for(int i=1;i<=n;i++) push(g[i]);
int ans=0,id=0;
for(int i=1;i<=n;i++)
{
int x=que[i];
pop(g[x]);
for(int i=L[x];i;i=E[i].nex) pop(f[E[i].ver]+g[x]+1);//ËüÕâ¸öÊÇÕýÏòtopÐòö¾Ù£¬µ«ÊÇÊÇ·´ÏòµÄ´¦Àí
int now=ask(1,1,n);
if(now<ans) ans=now,id=x;
for(int i=l[x];i;i=e[i].nex) push(g[e[i].ver]+f[x]+1);
push(f[x]);
}
printf("%d %d",ans,id);
}