#include <bits/stdc++.h>
using namespace std;
bool g[110][110],dp[110][110],ans[110],ret;
int T,n,color[110],cnt,num[110][4],res,get_color[110][110],pre[110][110];
vector<int> r[110][3];
void dfs(int i,int fa,int c){
if(ret==1)return;
color[i]=c;
++num[cnt][c];
r[cnt][c].push_back(i);
for(int j=1;j<=n;j++)
if(!g[i][j]&&i!=j&&j!=fa){
if(!color[j])dfs(j,i,3-c);
else if(color[j]==c){
ret=1;
return;
}
}
}
void run(){
cin>>n;
for(int i=1,tmp;i<=n;i++)
while(cin>>tmp&&tmp!=0)
g[i][tmp]=1;
for(int i=1;i<=n;i++)
for(int j=i+1;j<=n;j++)
if(g[i][j]!=g[j][i])
g[i][j]=g[j][i]=0;
for(int i=1;i<=n;i++)
if(!color[i]){
++cnt;
dfs(i,0,1);
if(ret==1)break;
}
if(ret==1){
cout<<"No solution";
return;
}
dp[0][0]=1;
for(int i=1,a,b;i<=cnt;i++){
a=num[i][1],b=num[i][2];
for(int j=1;j<=n;j++){
if(j>=a&&dp[i-1][j-a])dp[i][j]=1,get_color[i][j]=1,pre[i][j]=j-a;
if(j>=b&&dp[i-1][j-b])dp[i][j]=1,get_color[i][j]=2,pre[i][j]=j-b;
}
}
for(int i=n/2;i>=1;i--)
if(dp[cnt][i]){
res=i;
break;
}
int i=cnt,j=res;
while(i&&j){
int c=get_color[i][j];
for(int k=0;k<r[i][c].size();k++)ans[r[i][c][k]]=1;
j=pre[i][j],i--;
}
cout<<res;
if(ans[1])cout<<" "<<1;
for(int i=1;i<=n;i++)
if(ans[i])
cout<<" "<<i;
cout<<"\n"<<n-res;
if(!ans[1])cout<<" "<<1;
for(int i=1;i<=n;i++)
if(!ans[i])
cout<<" "<<i;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin>>T;
while(T--){
memset(g,0,sizeof g);
memset(dp,0,sizeof dp);
memset(ans,0,sizeof ans);
memset(color,0,sizeof color);
memset(num,0,sizeof num);
memset(get_color,0,sizeof get_color);
memset(pre,0,sizeof pre);
for(int i=0;i<110;i++)
for(int j=0;j<3;j++)
r[i][j].clear();
cnt=res=ret=0;
run();
if(T!=0)cout<<endl<<endl;
else cout<<endl;
}
return 0;
}