#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<vector>
#include<queue>
#include<cmath>
#include<map>
#include<set>
#define LL long long int
#define REP(i,n) for (int i = 1; i <= (n); i++)
#define Redge(u) for (int k = h[u],to; k; k = ed[k].nxt)
#define cls(s,v) memset(s,v,sizeof(s))
#define mp(a,b) make_pair<int,int>(a,b)
#define cp pair<int,int>
using namespace std;
const int maxn = 300005,maxm = 10000005,INF = 0x3f3f3f3f;
inline int read(){
int out = 0,flag = 1; char c = getchar();
while (c < 48 || c > 57){if (c == '-') flag = 0; c = getchar();}
while (c >= 48 && c <= 57){out = (out << 1) + (out << 3) + c - 48; c = getchar();}
return flag ? out : -out;
}
int n,pre[maxn],ans[maxn];
int mn[maxm],ls[maxm],rs[maxm],rt[maxn],cnt,L,R;
void modify(int& u,int v,int l,int r,int V){
if (!u) {u = ++cnt; ls[u] = ls[v]; rs[u] = rs[v]; mn[u] = mn[v];}
if (l == r) {mn[u] = V; return;}
int mid = (l + r) >> 1;
if (mid >= L) modify(ls[u],ls[v],l,mid,V);
else modify(rs[u],rs[v],mid + 1,r,V);
mn[u] = min(mn[ls[u]],mn[rs[u]]);
}
int query(int u,int l,int r){
if (l == r) return l;
int mid = (l + r) >> 1;
if (mn[ls[u]] < L) return query(ls[u],l,mid);
return query(rs[u],mid + 1,r);
}
int main(){
n = read();
for (int i = 1; i <= n; i++){
if (!pre[i] || pre[i] == i - 1) ans[i] = 1;
else {L = pre[i] + 1; ans[i] = query(rt[i - 1],1,n);}
L = ans[i];
modify(rt[i],rt[i - 1],1,n,i);
int m = read(),u;
for (int j = 1; j <= m; j++){
u = read();
if (!pre[u]) pre[u] = i;
}
}
printf("%d",ans[1]);
for (int i = 2; i <= n; i++) printf(" %d",ans[i]); puts("");
return 0;
}