#pragma GCC optimize ("Ofast")
#include<bits/stdc++.h>
using namespace std;
void * wmem;
char memarr[ 96000000 ] ;
template < class T> inline void walloc1d( T ** arr, int x, void ** mem = & wmem) {
static int skip[ 16 ] = { 0 , 15 , 14 , 13 , 12 , 11 , 10 , 9 , 8 , 7 , 6 , 5 , 4 , 3 , 2 , 1 } ;
( * mem) = ( void * ) ( ( ( char * ) ( * mem) ) + skip[ ( ( unsigned long long ) ( * mem) ) & 15 ] ) ;
( * arr) = ( T* ) ( * mem) ;
( * mem) = ( ( * arr) + x) ;
}
struct graph{
int N;
int * es;
int ** edge;
void setDirectEdge( int N__, int M, int A[ ] , int B[ ] , void ** mem = & wmem) {
int i;
N = N__;
walloc1d( & es, N, mem) ;
walloc1d( & edge, N, mem) ;
walloc1d( & edge[ 0 ] , M, mem) ;
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
es[ i] = 0 ;
}
for ( i= ( 0 ) ; i< ( M) ; i++ ) {
es[ A[ i] ] ++ ;
}
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
walloc1d( & edge[ i] , es[ i] , mem) ;
}
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
es[ i] = 0 ;
}
for ( i= ( 0 ) ; i< ( M) ; i++ ) {
edge[ A[ i] ] [ es[ A[ i] ] ++ ] = B[ i] ;
}
}
int TopologicalSort( int res[ ] , void * mem= wmem) {
int i;
int j;
int k;
int rs;
int * deg;
int * q;
int qs = 0 ;
int qe = 0 ;
walloc1d( & deg, N, & mem) ;
walloc1d( & q, N, & mem) ;
rs = 0 ;
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
deg[ i] = 0 ;
}
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
for ( j= ( 0 ) ; j< ( es[ i] ) ; j++ ) {
deg[ edge[ i] [ j] ] ++ ;
}
}
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
if ( deg[ i] == 0 ) {
q[ qe++ ] = i;
}
}
while ( qs < qe) {
i = q[ qs++ ] ;
res[ rs++ ] = i;
for ( j= ( 0 ) ; j< ( es[ i] ) ; j++ ) {
k = edge[ i] [ j] ;
deg[ k] -- ;
if ( deg[ k] == 0 ) {
q[ qe++ ] = k;
}
}
}
if ( rs== N) {
return 1 ;
}
return 0 ;
}
}
;
#define main dummy_main
int main( ) {
wmem = memarr;
return 0 ;
}
#undef main
graph g;
int gn[ 30000 ] ;
int gi[ 30000 ] ;
vector< int > gnode[ 60000 ] ;
int gs[ 60000 ] ;
vector< int > A;
vector< int > B;
vector< int > pA[ 60000 ] ;
vector< int > pB[ 60000 ] ;
int M;
int tA[ 1000000 ] ;
int tB[ 1000000 ] ;
int tmparr[ 1000000 ] ;
int ts[ 60000 ] ;
class Solution{
public :
vector< int > sortItems( int n, int m, vector< int > & group, vector< vector< int >> & beforeItems) {
dummy_main( ) ;
int i;
int j;
int k;
int x;
vector< int > res;
for ( i= ( 0 ) ; i< ( n) ; i++ ) {
if ( group[ i] == - 1 ) {
group[ i] = m++ ;
}
}
A.clear ( ) ;
B.clear ( ) ;
for ( i= ( 0 ) ; i< ( m) ; i++ ) {
pA[ i] .clear ( ) ;
}
for ( i= ( 0 ) ; i< ( m) ; i++ ) {
pB[ i] .clear ( ) ;
}
for ( i= ( 0 ) ; i< ( m) ; i++ ) {
gs[ i] = 0 ;
}
for ( i= ( 0 ) ; i< ( m) ; i++ ) {
gnode[ i] .clear ( ) ;
}
for ( i= ( 0 ) ; i< ( n) ; i++ ) {
j = group[ i] ;
gn[ i] = j;
gi[ i] = gs[ j] ++ ;
gnode[ j] .push_back ( i) ;
}
for ( i= ( 0 ) ; i< ( n) ; i++ ) {
for ( j= ( 0 ) ; j< ( beforeItems[ i] .size ( ) ) ; j++ ) {
k = beforeItems[ i] [ j] ;
if ( gn[ i] == gn[ k] ) {
x = gn[ i] ;
pA[ x] .push_back ( gi[ k] ) ;
pB[ x] .push_back ( gi[ i] ) ;
}
else {
A.push_back ( gn[ k] ) ;
B.push_back ( gn[ i] ) ;
}
}
}
for ( k= ( 0 ) ; k< ( m) ; k++ ) {
M = 0 ;
for ( i= ( 0 ) ; i< ( pA[ k] .size ( ) ) ; i++ ) {
tA[ M] = pA[ k] [ i] ;
tB[ M++ ] = pB[ k] [ i] ;
}
g.setDirectEdge ( gs[ k] , M, tA, tB) ;
i = g.TopologicalSort ( ts) ;
if ( i== 0 ) {
return res;
}
for ( i= ( 0 ) ; i< ( gs[ k] ) ; i++ ) {
tmparr[ i] = gnode[ k] [ i] ;
}
for ( i= ( 0 ) ; i< ( gs[ k] ) ; i++ ) {
gnode[ k] [ i] = tmparr[ ts[ i] ] ;
}
}
M = 0 ;
for ( i= ( 0 ) ; i< ( A.size ( ) ) ; i++ ) {
tA[ M] = A[ i] ;
tB[ M++ ] = B[ i] ;
}
g.setDirectEdge ( m, M, tA, tB) ;
i = g.TopologicalSort ( ts) ;
if ( i== 0 ) {
return res;
}
for ( i= ( 0 ) ; i< ( m) ; i++ ) {
x = ts[ i] ;
for ( j= ( 0 ) ; j< ( gs[ x] ) ; j++ ) {
res.push_back ( gnode[ x] [ j] ) ;
}
}
return res;
}
}
;
// cLay varsion 20190921-1
// --- original code ---
// #define main dummy_main
// {}
// #undef main
//
// graph g;
//
// int gn[3d4], gi[3d4];
// vector<int> gnode[6d4];
// int gs[6d4];
// vector<int> A, B, pA[6d4], pB[6d4];
// int M, tA[1d6], tB[1d6];
// int tmparr[1d6], ts[6d4];
//
// class Solution {
// public:
// vector<int> sortItems(int n, int m, vector<int>& group, vector<vector<int>>& beforeItems) {
// dummy_main();
//
// int i, j, k, x;
// vector<int> res;
//
// rep(i,n) if(group[i]==-1) group[i] = m++;
//
// A.clear();
// B.clear();
// rep(i,m) pA[i].clear();
// rep(i,m) pB[i].clear();
//
// rep(i,m) gs[i] = 0;
// rep(i,m) gnode[i].clear();
//
// rep(i,n){
// j = group[i];
// gn[i] = j;
// gi[i] = gs[j]++;
// gnode[j].push_back(i);
// }
//
// rep(i,n) rep(j,beforeItems[i].size()){
// k = beforeItems[i][j];
// if(gn[i]==gn[k]){
// x = gn[i];
// pA[x].push_back(gi[k]);
// pB[x].push_back(gi[i]);
// } else {
// A.push_back(gn[k]);
// B.push_back(gn[i]);
// }
// }
//
// rep(k,m){
// M = 0;
// rep(i,pA[k].size()) tA[M] = pA[k][i], tB[M++] = pB[k][i];
// g.setDirectEdge(gs[k], M, tA, tB);
// i = g.TopologicalSort(ts);
// if(i==0) return res;
// rep(i,gs[k]) tmparr[i] = gnode[k][i];
// rep(i,gs[k]) gnode[k][i] = tmparr[ts[i]];
// }
//
// M = 0;
// rep(i,A.size()) tA[M] = A[i], tB[M++] = B[i];
// g.setDirectEdge(m, M, tA, tB);
// i = g.TopologicalSort(ts);
// if(i==0) return res;
// rep(i,m){
// x = ts[i];
// rep(j,gs[x]) res.push_back(gnode[x][j]);
// }
// return res;
// }
// };
I3ByYWdtYSBHQ0Mgb3B0aW1pemUgKCJPZmFzdCIpCiNpbmNsdWRlPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CnZvaWQgKndtZW07CmNoYXIgbWVtYXJyWzk2MDAwMDAwXTsKdGVtcGxhdGU8Y2xhc3MgVD4gaW5saW5lIHZvaWQgd2FsbG9jMWQoVCAqKmFyciwgaW50IHgsIHZvaWQgKiptZW0gPSAmd21lbSl7CiAgc3RhdGljIGludCBza2lwWzE2XSA9IHswLCAxNSwgMTQsIDEzLCAxMiwgMTEsIDEwLCA5LCA4LCA3LCA2LCA1LCA0LCAzLCAyLCAxfTsKICAoKm1lbSkgPSAodm9pZCopKCAoKGNoYXIqKSgqbWVtKSkgKyBza2lwWygodW5zaWduZWQgbG9uZyBsb25nKSgqbWVtKSkgJiAxNV0gKTsKICAoKmFycik9KFQqKSgqbWVtKTsKICAoKm1lbSk9KCgqYXJyKSt4KTsKfQpzdHJ1Y3QgZ3JhcGh7CiAgaW50IE47CiAgaW50ICplczsKICBpbnQgKiplZGdlOwogIHZvaWQgc2V0RGlyZWN0RWRnZShpbnQgTl9fLCBpbnQgTSwgaW50IEFbXSwgaW50IEJbXSwgdm9pZCAqKm1lbSA9ICZ3bWVtKXsKICAgIGludCBpOwogICAgTiA9IE5fXzsKICAgIHdhbGxvYzFkKCZlcywgTiwgbWVtKTsKICAgIHdhbGxvYzFkKCZlZGdlLCBOLCBtZW0pOwogICAgd2FsbG9jMWQoJmVkZ2VbMF0sIE0sIG1lbSk7CiAgICBmb3IoaT0oMCk7aTwoTik7aSsrKXsKICAgICAgZXNbaV0gPSAwOwogICAgfQogICAgZm9yKGk9KDApO2k8KE0pO2krKyl7CiAgICAgIGVzW0FbaV1dKys7CiAgICB9CiAgICBmb3IoaT0oMCk7aTwoTik7aSsrKXsKICAgICAgd2FsbG9jMWQoJmVkZ2VbaV0sIGVzW2ldLCBtZW0pOwogICAgfQogICAgZm9yKGk9KDApO2k8KE4pO2krKyl7CiAgICAgIGVzW2ldID0gMDsKICAgIH0KICAgIGZvcihpPSgwKTtpPChNKTtpKyspewogICAgICBlZGdlW0FbaV1dW2VzW0FbaV1dKytdID0gQltpXTsKICAgIH0KICB9CiAgaW50IFRvcG9sb2dpY2FsU29ydChpbnQgcmVzW10sIHZvaWQgKm1lbT13bWVtKXsKICAgIGludCBpOwogICAgaW50IGo7CiAgICBpbnQgazsKICAgIGludCByczsKICAgIGludCAqZGVnOwogICAgaW50ICpxOwogICAgaW50IHFzID0gMDsKICAgIGludCBxZSA9IDA7CiAgICB3YWxsb2MxZCgmZGVnLCBOLCAmbWVtKTsKICAgIHdhbGxvYzFkKCZxLCBOLCAmbWVtKTsKICAgIHJzID0gMDsKICAgIGZvcihpPSgwKTtpPChOKTtpKyspewogICAgICBkZWdbaV0gPSAwOwogICAgfQogICAgZm9yKGk9KDApO2k8KE4pO2krKyl7CiAgICAgIGZvcihqPSgwKTtqPChlc1tpXSk7aisrKXsKICAgICAgICBkZWdbZWRnZVtpXVtqXV0rKzsKICAgICAgfQogICAgfQogICAgZm9yKGk9KDApO2k8KE4pO2krKyl7CiAgICAgIGlmKGRlZ1tpXT09MCl7CiAgICAgICAgcVtxZSsrXSA9IGk7CiAgICAgIH0KICAgIH0KICAgIHdoaWxlKHFzIDwgcWUpewogICAgICBpID0gcVtxcysrXTsKICAgICAgcmVzW3JzKytdID0gaTsKICAgICAgZm9yKGo9KDApO2o8KGVzW2ldKTtqKyspewogICAgICAgIGsgPSBlZGdlW2ldW2pdOwogICAgICAgIGRlZ1trXS0tOwogICAgICAgIGlmKGRlZ1trXT09MCl7CiAgICAgICAgICBxW3FlKytdID0gazsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGlmKHJzPT1OKXsKICAgICAgcmV0dXJuIDE7CiAgICB9CiAgICByZXR1cm4gMDsKICB9Cn0KOwojZGVmaW5lIG1haW4gZHVtbXlfbWFpbgppbnQgbWFpbigpewogIHdtZW0gPSBtZW1hcnI7CiAgcmV0dXJuIDA7Cn0KI3VuZGVmIG1haW4KZ3JhcGggZzsKaW50IGduWzMwMDAwXTsKaW50IGdpWzMwMDAwXTsKdmVjdG9yPGludD4gZ25vZGVbNjAwMDBdOwppbnQgZ3NbNjAwMDBdOwp2ZWN0b3I8aW50PiBBOwp2ZWN0b3I8aW50PiBCOwp2ZWN0b3I8aW50PiBwQVs2MDAwMF07CnZlY3RvcjxpbnQ+IHBCWzYwMDAwXTsKaW50IE07CmludCB0QVsxMDAwMDAwXTsKaW50IHRCWzEwMDAwMDBdOwppbnQgdG1wYXJyWzEwMDAwMDBdOwppbnQgdHNbNjAwMDBdOwpjbGFzcyBTb2x1dGlvbnsKICBwdWJsaWM6CiAgdmVjdG9yPGludD4gc29ydEl0ZW1zKGludCBuLCBpbnQgbSwgdmVjdG9yPGludD4mIGdyb3VwLCB2ZWN0b3I8dmVjdG9yPGludD4+JiBiZWZvcmVJdGVtcyl7CiAgICBkdW1teV9tYWluKCk7CiAgICBpbnQgaTsKICAgIGludCBqOwogICAgaW50IGs7CiAgICBpbnQgeDsKICAgIHZlY3RvcjxpbnQ+IHJlczsKICAgIGZvcihpPSgwKTtpPChuKTtpKyspewogICAgICBpZihncm91cFtpXT09LTEpewogICAgICAgIGdyb3VwW2ldID0gbSsrOwogICAgICB9CiAgICB9CiAgICBBLmNsZWFyKCk7CiAgICBCLmNsZWFyKCk7CiAgICBmb3IoaT0oMCk7aTwobSk7aSsrKXsKICAgICAgcEFbaV0uY2xlYXIoKTsKICAgIH0KICAgIGZvcihpPSgwKTtpPChtKTtpKyspewogICAgICBwQltpXS5jbGVhcigpOwogICAgfQogICAgZm9yKGk9KDApO2k8KG0pO2krKyl7CiAgICAgIGdzW2ldID0gMDsKICAgIH0KICAgIGZvcihpPSgwKTtpPChtKTtpKyspewogICAgICBnbm9kZVtpXS5jbGVhcigpOwogICAgfQogICAgZm9yKGk9KDApO2k8KG4pO2krKyl7CiAgICAgIGogPSBncm91cFtpXTsKICAgICAgZ25baV0gPSBqOwogICAgICBnaVtpXSA9IGdzW2pdKys7CiAgICAgIGdub2RlW2pdLnB1c2hfYmFjayhpKTsKICAgIH0KICAgIGZvcihpPSgwKTtpPChuKTtpKyspewogICAgICBmb3Ioaj0oMCk7ajwoYmVmb3JlSXRlbXNbaV0uc2l6ZSgpKTtqKyspewogICAgICAgIGsgPSBiZWZvcmVJdGVtc1tpXVtqXTsKICAgICAgICBpZihnbltpXT09Z25ba10pewogICAgICAgICAgeCA9IGduW2ldOwogICAgICAgICAgcEFbeF0ucHVzaF9iYWNrKGdpW2tdKTsKICAgICAgICAgIHBCW3hdLnB1c2hfYmFjayhnaVtpXSk7CiAgICAgICAgfQogICAgICAgIGVsc2V7CiAgICAgICAgICBBLnB1c2hfYmFjayhnbltrXSk7CiAgICAgICAgICBCLnB1c2hfYmFjayhnbltpXSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBmb3Ioaz0oMCk7azwobSk7aysrKXsKICAgICAgTSA9IDA7CiAgICAgIGZvcihpPSgwKTtpPChwQVtrXS5zaXplKCkpO2krKyl7CiAgICAgICAgdEFbTV0gPSBwQVtrXVtpXTsKICAgICAgICB0QltNKytdID0gcEJba11baV07CiAgICAgIH0KICAgICAgZy5zZXREaXJlY3RFZGdlKGdzW2tdLCBNLCB0QSwgdEIpOwogICAgICBpID0gZy5Ub3BvbG9naWNhbFNvcnQodHMpOwogICAgICBpZihpPT0wKXsKICAgICAgICByZXR1cm4gcmVzOwogICAgICB9CiAgICAgIGZvcihpPSgwKTtpPChnc1trXSk7aSsrKXsKICAgICAgICB0bXBhcnJbaV0gPSBnbm9kZVtrXVtpXTsKICAgICAgfQogICAgICBmb3IoaT0oMCk7aTwoZ3Nba10pO2krKyl7CiAgICAgICAgZ25vZGVba11baV0gPSB0bXBhcnJbdHNbaV1dOwogICAgICB9CiAgICB9CiAgICBNID0gMDsKICAgIGZvcihpPSgwKTtpPChBLnNpemUoKSk7aSsrKXsKICAgICAgdEFbTV0gPSBBW2ldOwogICAgICB0QltNKytdID0gQltpXTsKICAgIH0KICAgIGcuc2V0RGlyZWN0RWRnZShtLCBNLCB0QSwgdEIpOwogICAgaSA9IGcuVG9wb2xvZ2ljYWxTb3J0KHRzKTsKICAgIGlmKGk9PTApewogICAgICByZXR1cm4gcmVzOwogICAgfQogICAgZm9yKGk9KDApO2k8KG0pO2krKyl7CiAgICAgIHggPSB0c1tpXTsKICAgICAgZm9yKGo9KDApO2o8KGdzW3hdKTtqKyspewogICAgICAgIHJlcy5wdXNoX2JhY2soZ25vZGVbeF1bal0pOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gcmVzOwogIH0KfQo7Ci8vIGNMYXkgdmFyc2lvbiAyMDE5MDkyMS0xCgovLyAtLS0gb3JpZ2luYWwgY29kZSAtLS0KLy8gI2RlZmluZSBtYWluIGR1bW15X21haW4KLy8ge30KLy8gI3VuZGVmIG1haW4KLy8gCi8vIGdyYXBoIGc7Ci8vIAovLyBpbnQgZ25bM2Q0XSwgZ2lbM2Q0XTsKLy8gdmVjdG9yPGludD4gZ25vZGVbNmQ0XTsKLy8gaW50IGdzWzZkNF07Ci8vIHZlY3RvcjxpbnQ+IEEsIEIsIHBBWzZkNF0sIHBCWzZkNF07Ci8vIGludCBNLCB0QVsxZDZdLCB0QlsxZDZdOwovLyBpbnQgdG1wYXJyWzFkNl0sIHRzWzZkNF07Ci8vIAovLyBjbGFzcyBTb2x1dGlvbiB7Ci8vIHB1YmxpYzoKLy8gICB2ZWN0b3I8aW50PiBzb3J0SXRlbXMoaW50IG4sIGludCBtLCB2ZWN0b3I8aW50PiYgZ3JvdXAsIHZlY3Rvcjx2ZWN0b3I8aW50Pj4mIGJlZm9yZUl0ZW1zKSB7Ci8vICAgICBkdW1teV9tYWluKCk7Ci8vIAovLyAgICAgaW50IGksIGosIGssIHg7Ci8vICAgICB2ZWN0b3I8aW50PiByZXM7Ci8vICAgICAKLy8gICAgIHJlcChpLG4pIGlmKGdyb3VwW2ldPT0tMSkgZ3JvdXBbaV0gPSBtKys7Ci8vIAovLyAgICAgQS5jbGVhcigpOwovLyAgICAgQi5jbGVhcigpOwovLyAgICAgcmVwKGksbSkgcEFbaV0uY2xlYXIoKTsKLy8gICAgIHJlcChpLG0pIHBCW2ldLmNsZWFyKCk7Ci8vIAovLyAgICAgcmVwKGksbSkgZ3NbaV0gPSAwOwovLyAgICAgcmVwKGksbSkgZ25vZGVbaV0uY2xlYXIoKTsKLy8gICAgIAovLyAgICAgcmVwKGksbil7Ci8vICAgICAgIGogPSBncm91cFtpXTsKLy8gICAgICAgZ25baV0gPSBqOwovLyAgICAgICBnaVtpXSA9IGdzW2pdKys7Ci8vICAgICAgIGdub2RlW2pdLnB1c2hfYmFjayhpKTsKLy8gICAgIH0KLy8gCi8vICAgICByZXAoaSxuKSByZXAoaixiZWZvcmVJdGVtc1tpXS5zaXplKCkpewovLyAgICAgICBrID0gYmVmb3JlSXRlbXNbaV1bal07Ci8vICAgICAgIGlmKGduW2ldPT1nbltrXSl7Ci8vICAgICAgICAgeCA9IGduW2ldOwovLyAgICAgICAgIHBBW3hdLnB1c2hfYmFjayhnaVtrXSk7Ci8vICAgICAgICAgcEJbeF0ucHVzaF9iYWNrKGdpW2ldKTsKLy8gICAgICAgfSBlbHNlIHsKLy8gICAgICAgICBBLnB1c2hfYmFjayhnbltrXSk7Ci8vICAgICAgICAgQi5wdXNoX2JhY2soZ25baV0pOwovLyAgICAgICB9Ci8vICAgICB9Ci8vIAovLyAgICAgcmVwKGssbSl7Ci8vICAgICAgIE0gPSAwOwovLyAgICAgICByZXAoaSxwQVtrXS5zaXplKCkpIHRBW01dID0gcEFba11baV0sIHRCW00rK10gPSBwQltrXVtpXTsKLy8gICAgICAgZy5zZXREaXJlY3RFZGdlKGdzW2tdLCBNLCB0QSwgdEIpOwovLyAgICAgICBpID0gZy5Ub3BvbG9naWNhbFNvcnQodHMpOwovLyAgICAgICBpZihpPT0wKSByZXR1cm4gcmVzOwovLyAgICAgICByZXAoaSxnc1trXSkgdG1wYXJyW2ldID0gZ25vZGVba11baV07Ci8vICAgICAgIHJlcChpLGdzW2tdKSBnbm9kZVtrXVtpXSA9IHRtcGFyclt0c1tpXV07Ci8vICAgICB9Ci8vIAovLyAgICAgTSA9IDA7Ci8vICAgICByZXAoaSxBLnNpemUoKSkgdEFbTV0gPSBBW2ldLCB0QltNKytdID0gQltpXTsKLy8gICAgIGcuc2V0RGlyZWN0RWRnZShtLCBNLCB0QSwgdEIpOwovLyAgICAgaSA9IGcuVG9wb2xvZ2ljYWxTb3J0KHRzKTsKLy8gICAgIGlmKGk9PTApIHJldHVybiByZXM7Ci8vICAgICByZXAoaSxtKXsKLy8gICAgICAgeCA9IHRzW2ldOwovLyAgICAgICByZXAoaixnc1t4XSkgcmVzLnB1c2hfYmFjayhnbm9kZVt4XVtqXSk7Ci8vICAgICB9Ci8vICAgICByZXR1cm4gcmVzOwovLyAgIH0KLy8gfTsK