#include<stdio.h>
int head[128],last[256],to[256],cnt=0;
int deg[128];
void add(int u,int v)
{
	cnt++;
	last[cnt]=head[u];
	head[u]=cnt;
	to[cnt]=v;
	deg[u]++;
}
int fa[128],dis[128];
void dfs(int u,int f,int d)
{
	fa[u]=f;
	dis[u]=d;
	for(int i=head[u];i;i=last[i])
	{
		int v=to[i];
		if(v==f)
		{
			continue;
		}
		dfs(v,u,d+1);
	}
}
int mx[128];
int len;
int n;
long long query()
{
	for(int i=0;i<len;i++)
	{
		mx[i]=0;
	}
	for(int i=1;i<=n;i++)
	{
		if(deg[i]-1>mx[dis[i]])
		{
			mx[dis[i]]=deg[i]-1;
		}
	}
	long long ans=1;
	for(int i=0;i<len-1;i++)
	{
		ans*=mx[i];
	}
	return ans;
}
int main()
{
	scanf("%d",&n);
	for(int i=1;i<n;i++)
	{
		int u,v;
		scanf("%d%d",&u,&v);
		add(u,v);
		add(v,u);
	}
	dfs(1,0,0);
	int u=0,d=-1;
	for(int i=1;i<=n;i++)
	{
		if(dis[i]>d)
		{
			u=i;
			d=dis[i];
		}
	}
	dfs(u,0,0);
	u=0,d=-1;
	for(int i=1;i<=n;i++)
	{
		if(dis[i]>d)
		{
			u=i;
			d=dis[i];
		}
	}
	len=(d>>1)+1;
	printf("%d ",len);
	for(int i=1;i<len;i++)
	{
		u=fa[u];
	}
	if(d&1)
	{
		int v=fa[u];
		dfs(u,v,0);
		dfs(v,u,0);
		printf("%lld\n",query()<<1);
		return 0;
	}
	dfs(u,0,0);
	deg[u]++;
	long long ans=query();
	deg[u]--;
	for(int i=head[u];i;i=last[i])
	{
		dfs(u,to[i],0);
		dfs(to[i],u,0);
		long long ans2=(query()<<1);
		if(ans2<ans)
		{
			ans=ans2;
		}
	}
	printf("%lld\n",ans);
	return 0;
}