#include<bits/stdc++.h>
using namespace std;
vector<int> b[200005];
int n,m,ver[200005],nex[200005],head[200005],deg[200005],tot;
void add(int x,int y){
tot++;
ver[tot]=y;
nex[tot]=head[x];
head[x]=tot;
deg[y]++;
}
void build(int x){
memset(deg,0,sizeof(deg));
memset(head,0,sizeof(head));
for(int i=1;i<=x;i++){
for(int j=0;j<b[i].size()-1;j++){
add(b[i][j],b[i][j+1]);
}
}
}
bool topsort_loop(int x){
build(x);
queue<int> q;
int tot=0;
for(int i=1;i<=n;i++)
if(deg[i]==0) q.push(i);
while(!q.empty()){
int x=q.front();q.pop();
for(int i=head[x];i;i=nex[i]){
int y=ver[i];
deg[y]--;
if(deg[y]==0)
q.push(y);
}
}
for(int i=1;i<=n;i++)
if(deg[i]==0) tot++;
if(tot<n) return true;
return false;
}
void topsort_answer(int x){
build(x);
priority_queue<int,vector<int>,greater<int> > q;
for(int i=1;i<=n;i++)
if(deg[i]==0) q.push(i);
while(!q.empty()){
int x=q.top();q.pop();
cout<<x<<" ";
for(int i=head[x];i;i=nex[i]){
int y=ver[i];
deg[y]--;
if(deg[y]==0)
q.push(y);
}
}
}
int main(){
cin>>n>>m;
for(int i=1;i<=m;i++){
int c;
cin>>c;
for(int j=1;j<=c;j++){
int a;
cin>>a;
b[i].push_back(a);
}
}
int l=1,r=m,ans;
while(l<=r){
int mid=(l+r)/2;
if(topsort_loop(mid)==false){
l=mid+1;
ans=mid;
}
else r=mid-1;
}
topsort_answer(ans);
return 0;
}