#include<iostream.h>
#include<conio.h>

long dagbeg[2000],dagend[2000],brdag=0,brvazli=0,exists[2000],root[2000];


long tree()
{
brvazli=0;

long pos=0,end=0,roots=0,brins=0;

for (end=0;end<2000;end++)
{
	if(dagend[end])
		{
		pos=dagend[end];
		root[pos]=0;
		}
	if(!exists[end]) root[end]=0;
}

for(pos=0;pos<2000;pos++)
{roots+=root[pos];}

if (roots>1 || !roots) return 0;

for(pos=0;pos<2000;pos++)
{brvazli+=exists[pos];}

for(end=0;end<2000;end++)
{
	brins=0;
	for(pos=0;pos<2000;pos++)
		{
		if(dagend[pos])brins+=(dagend[pos]==end);
		}
if(brins>1) return 0;
}

return 1;
}

long roots()
{
	for(long k=0;k<2000;k++)
	{
	if(root[k]) return k;
	}
	return 0;
}

void main()
{
long pos=0;

for(pos=0;pos<2000;pos++)
	{
	root[pos]=1;
	}

clrscr();

cin>>brdag;

for(long k=0;k<brdag;k++)
	{
	cin>>dagbeg[k]>>dagend[k];
	pos=dagbeg[k];
	exists[pos]=1;
	pos=dagend[k];
	exists[pos]=1;
	}

if(!tree()) cout<<"0 0";
else cout<<brvazli<<" "<<roots();

getch();
}