#include<iostream>
#include<math.h>
#include<algorithm>
#include<queue>
#include<map>
#include<set>
#include<stack>
#include<string>
#include<vector>
using namespace std;
#define INF 100000000
#define maxn 100010
struct node{
vector<int> child;
int level;
};
node tree[maxn];
int n,nleaf;
int gnum[maxn]={0};
int level=0;
void BFS(int root)//注意怎么记录层次
{
queue<int> q;
q.push(root);
tree[root].level=1;
if(tree[root].child.empty()) {
gnum[1]=1;
return; }
while(!q.empty())
{
int temp;
temp=q.front();
q.pop();
gnum[tree[temp].level]++ ;
for(int i=0;i<tree[temp].child.size();i++)
{
q.push(tree[temp].child[i]);
tree[tree[temp].child[i]].level=tree[temp].level+1;
}
}
}
bool cmp(int a,int b)
{
return a>b;
}
int main()
{
cin>>n>>nleaf;
for(int i=1;i<=nleaf;i++)
{
int id,num;
cin>>id>>num;
for(int j=0;j<num;j++)
{
int temp;
cin>>temp;
tree[id].child.push_back(temp);
}
}
#include<math.h>
#include<algorithm>
#include<queue>
#include<map>
#include<set>
#include<stack>
#include<string>
#include<vector>
using namespace std;
#define INF 100000000
#define maxn 100010
struct node{
vector<int> child;
int level;
};
node tree[maxn];
int n,nleaf;
int gnum[maxn]={0};
int level=0;
void BFS(int root)//注意怎么记录层次
{
queue<int> q;
q.push(root);
tree[root].level=1;
if(tree[root].child.empty()) {
gnum[1]=1;
return; }
while(!q.empty())
{
int temp;
temp=q.front();
q.pop();
gnum[tree[temp].level]++ ;
for(int i=0;i<tree[temp].child.size();i++)
{
q.push(tree[temp].child[i]);
tree[tree[temp].child[i]].level=tree[temp].level+1;
}
}
}
bool cmp(int a,int b)
{
return a>b;
}
int main()
{
cin>>n>>nleaf;
for(int i=1;i<=nleaf;i++)
{
int id,num;
cin>>id>>num;
for(int j=0;j<num;j++)
{
int temp;
cin>>temp;
tree[id].child.push_back(temp);
}
}
BFS(1);
//cout<<gnum[1]<<endl;
int max=-INF;
int record=-1;
for(int i=1;i<n+1;i++)
if(gnum[i]>max)
{
record=i;
max=gnum[i];
}
cout<<max<<" "<<record;
}
//cout<<gnum[1]<<endl;
int max=-INF;
int record=-1;
for(int i=1;i<n+1;i++)
if(gnum[i]>max)
{
record=i;
max=gnum[i];
}
cout<<max<<" "<<record;
}