#include <stdio.h>
#include <vector>
#include <queue>

int indegree[1010];
int G[1010][1010];

int main() {
    int n, m, vcnt=0;
    scanf("%d %d", &n, &m);

    for(int i=0; i<m; i++) {
        int K, arr[1010]={};
        scanf("%d", &K);
        for(int j=0; j<K; j++) scanf("%d", &arr[j]);

        for(int j=0; j<K; j++) {
            for(int k=j+1; k<K; k++) {
                if(!G[arr[j]][arr[k]]) {
                    G[arr[j]][arr[k]]=1;
                    indegree[arr[k]]++;
                }
            }
        }
    }

    int flag=0;

    std::queue<int> q;
    std::vector<int> v;
    while(vcnt<n) {
        for(int i=1; i<=n; i++) {
            if(indegree[i]==0) {
                q.push(i);
                indegree[i]=-1;
            }
            if(i==n&&q.empty()) { // 끝까지 왔는데 큐가 비어있는 경우
                flag=1;
            }  
        }
        if(flag) break;
        while(!q.empty()) {
            int S=q.front(); q.pop();
            v.push_back(S);
            vcnt++;
            
            for(int j=1; j<=n; j++) {
                if(G[S][j])
                    indegree[j]--;
            }
        }
    }

    if(flag) printf("0");
    else {
        for(int i=0; i<v.size(); i++)
            printf("%d\n", v[i]);
    }
}

Embed on website

To embed this project on your website, copy the following code and paste it into your website's HTML: