Learning4Fun ural 1106

/*题意:把一个图中的点分为两组,保证每个组的任意节点在另外一组一定有一个与之相邻的节点。
 * 解法:bfs一遍黑白染色。图可能不联通。只有一个节点的则不能成功分组。
 */
#include <functional>
#include <algorithm>
#include <iostream>
#include <iomanip>
#include <numeric>
#include <cstring>
#include <cassert>
#include <cstdio>
#include <string>
#include <vector>
#include <bitset>
#include <queue>
#include <stack>
#include <math.h>
#include <ctime>
#include <list>
#include <set>
#include <map>
#include<time.h>
using namespace std;
#define LL long long
#define vN 105
int adj[vN][vN];
int used[vN],n;
int color[vN];
int bfs(int x)
{
    int cnt=0;
    queue<int> q;
    q.push(x);
    used[x]=1;
    color[x]=0;
    while(!q.empty())
    {
        int u=q.front()
                ;
        q.pop();
        cnt++;
        for(int i=1;i<=n;i++)
        {
            if(!used[i]&&adj[u][i])
            {
                q.push(i);
                color[i]=1-color[u];
                used[i]=1;
            }
        }
    }
    return cnt;
}

int main()
{
    //freopen("data.in","r",stdin);
    memset(used,0,sizeof(used));
    memset(adj,0,sizeof(adj));
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        int x;
        while(cin>>x&&x)
        {
            adj[i][x]=1;
            adj[x][i]=1;
        }
    }
    int ans=-1;
    for(int i=1;i<=n;i++)
    {
        if(!used[i])
        {
            int flag=bfs(i);
            if(flag==1)
            {
                ans=0;
            }
        }
    }
    if(ans==0)cout<<ans<<endl;
    else
    {
        int cnt=0;
        for(int i=1;i<=n;i++)
        {
            if(color[i])cnt++;
        }
        cout<<cnt<<endl;
        for(int i=1;i<=n;i++)
        {
            if(color[i])
            {
                cout<<i<<" ";
            }
        }
        cout<<endl;
    }

}