Source Code
#include <bits/stdc++.h>
#include <chrono>
#include <random>
#define ll long long
#define ld long double
#define pb push_back
#define pii pair<int,int>
#define pll pair<long long,long long>
#define F first
#define S second
#define all(a) a.begin(),a.end()

using namespace std;

const ll Mod=1e9+7 ;

ll poww(ll a,ll b,ll mod){
    ll res=1;if(b<0)b=(b%(mod-1)+mod-1)%(mod-1);
    for(;b;b>>=1,a=1ll*a*a%mod)
      if(b&1)res=1ll*res*a%mod;
    return res;
}

void Max(ll& x,ll y){
x=max(x,y);
}
void Min(ll& x,ll y){
x=min(x,y);
}
void OK(bool yes){
    cout<<(yes?"Yes\n":"No\n");
}

const ll N=500500,M=2010,LN=(1<<24),K=17,Mx=4e6+50,inf=3e18,Mod1=1e9+7,Mod2=999997457;
const ld pi=acos(-1),eps=1e-12;

ll Fact[N];
void init(){
Fact[0]=1ll;
for(int i=1;i<N;i++)Fact[i]=(1ll*Fact[i-1]*i)%Mod;
}
int Cnk(ll x,ll y){
if(y > x)return 0;
return (  ((Fact[x]*poww(Fact[y],-1,Mod))%Mod)  *poww(Fact[x-y],-1,Mod))%Mod;
}


void Add(ll& x,ll y,int j=0){
ll mod=Mod;
if(j==1)mod=Mod1;
if(j==2)mod=Mod2;
x%=mod;
y%=mod;
if(x<0)x+=mod;
if(y<0)y+=mod;
x=(x+y>=mod?x+y-mod:x+y);
}
/*
void init(){
Fact[0]=iFact[0]=1ll;
for(int i=1;i<N;i++)Fact[i]=(Fact[i-1]*i)%Mod;
for(int i=1;i<N;i++)iFact[i]=(iFact[i-1]*poww(i,-1,Mod))%Mod;
}
*/

bool ok=1;

ll vis[N];

vector<ll> v1[N],Ans;
vector<pll> v[N];
map<pll,vector<ll>> pos;

void dfs(ll x){
if(vis[x])return;
vis[x]=1;
for(auto p:v1[x])Ans.pb(p);
if(v[x].size()<=2){
    for(auto p:v[x]){
        if(vis[p.F])continue;
        ll X=min(p.F,x);
        ll Y=max(p.F,x);
        for(auto pp:pos[{X,Y}]){
            Ans.pb(pp);
        }
        dfs(p.F);
    }
}
else{
    ll cnt=0,cnt2=0;
    for(auto p:v[x]){
        if(vis[p.F])continue;
        if(v[p.F].size()>1)cnt++;
        if(!v1[p.F].empty())cnt2++;
        if(cnt>1)break;
    }
    if(cnt>1||cnt2>1){
        ok=0;
        return;
    }
    if(cnt==0){
        ll later=0,later_Ans=0;
        for(auto p:v[x]){
            if(vis[p.F])continue;
            if(!v1[p.F].empty()){
                later=p.F;
                later_Ans=p.S;
            }
            else{
                ll X=min(p.F,x);
                ll Y=max(p.F,x);
                for(auto pp:pos[{X,Y}]){
                    Ans.pb(pp);
                }
                dfs(p.F);
            }
        }
        if(later){
            ll X=min(later,x);
            ll Y=max(later,x);
            for(auto pp:pos[{X,Y}]){
                Ans.pb(pp);
            }
            dfs(later);
        }
    }
    else{

        ll later=0,later_Ans=0;
        for(auto p:v[x]){
            if(vis[p.F])continue;
            if(v[p.F].size()>1){
                later=p.F;
                later_Ans=p.S;
            }
            else{
                ll X=min(p.F,x);
                ll Y=max(p.F,x);
                for(auto pp:pos[{X,Y}]){
                    Ans.pb(pp);
                }
                if(!v1[p.F].empty())ok=0;
                dfs(p.F);
            }
        }
        if(later){
            ll X=min(later,x);
            ll Y=max(later,x);
            for(auto pp:pos[{X,Y}]){
                Ans.pb(pp);
            }
            dfs(later);
        }
    }
}

}


int main()
{
    //ios::sync_with_stdio(0);
    //cin.tie(0);
    //cout.tie(0);

    mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

    //freopen("heinto.in","r",stdin);


    int T=1;
    int Case=1;
    //init();
    //cin>>T;
    while(T--){
        ll n,m;
        cin>>n>>m;
        for(int i=1;i<=n;i++){
            ll k;
            cin>>k;
            if(k==1){
                ll x;
                cin>>x;
                v1[x].pb(i);
            }
            else{
                ll x,y;
                cin>>x>>y;
                if(x>y)swap(x,y);
                if(!pos[{x,y}].empty())pos[{x,y}].pb(i);
                else{
                    pos[{x,y}].pb(i);
                    v[x].pb({y,i});
                    v[y].pb({x,i});
                }
            }
        }
        for(int i=1;i<=m;i++){
            if(vis[i])continue;
            if(v[i].size()<=1&&(!v1[i].empty())){
                dfs(i);
            }
        }
        for(int i=1;i<=m;i++){
            if(vis[i])continue;
            if(v[i].size()<=1){
                dfs(i);
            }
        }
        if(Ans.size()!=n)ok=0;
        if(ok){
            for(auto p:Ans)cout<<p<<' ';
            cout<<'\n';
        }
        else{
            cout<<-1<<'\n';
        }
        //OK(ok);
    }

    return 0;
}
/*

6 7
2 1 2
2 2 7
2 4 7
2 5 4
2 5 6
2 3 7

3 3
2 1 2
2 1 2
2 1 3


10 5
2 5 1
2 5 2
2 5 3
2 5 4
1 1
1 2
1 2
2 5 3
2 5 4
1 4

7 4
2 1 2
2 2 3
2 2 4
1 3
1 4
1 3
1 4

*/

Copy
Gym Wise-ard
GNU G++17
15 ms
24.1 MB
Wrong Answer