#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define lowbit(x) x&(-x)
const int mxn=2e5+114;
const int md=1e9+7;
int n,m,rd[mxn];
bool vis[mxn];
vector <int> e[mxn];
vector <int> disc[mxn];
vector <int>ansl;
bool check(int le)
{
for (int i=1;i<=n;i++) e[i].clear();
memset(rd,0,sizeof(rd));
memset(vis,0,sizeof(vis));
int las;
for (int i=1;i<=le;i++)
{
las=0;
for (auto x:disc[i])
{
if (las==0)
{
las=x;continue;
}
e[las].push_back(x);
rd[x]++;
las=x;
}
}
for (int i=1;i<=n;i++)
{
sort(e[i].begin(),e[i].end());
}
queue <int> q;
for (int i=1;i<=n;i++)
{
if (rd[i]==0) q.push(i);
}
vector <int> tmp;
while (!q.empty())
{
int u=q.front();q.pop();
if (vis[u]) continue;
tmp.push_back(u);
vis[u]=1;
for (auto v:e[u])
{
rd[v]--;
if (!vis[v]) q.push(v);
}
}
for (int i=1;i<=n;i++) if (vis[i]==0) return 0;
ansl=tmp;return 1;
}
inline void solve()
{
cin>>n>>m;
for (int i=1;i<=m;i++)
{
int x;cin>>x;
while (x--)
{
int v;cin>>v;
disc[i].push_back(v);
}
}
int l=1,r=m,ans=-0;
while (l<r)
{
int mid=(l+r)/2;
if (check(mid))
{
ans=mid;l=mid+1;
}
else r=mid-1;
}
check(ans);
for (auto x:ansl) cout<<x<<" ";
return void();
}
signed main()
{
cin.tie(0);cout.tie(0);
ios::sync_with_stdio(0);
int t=1;
// cin>>t;
while (t--) solve();
return 0;
}
二分+拓扑