#include <iostream> #include <array> #include <algorithm> #include <vector> #include <set> #include <unordered_set> #include <cmath> #include <complex> #include <deque> #include <iterator> #include <numeric> #include <map> #include <unordered_map> #include <queue> #include <stack> #include <string> #include <tuple> #include <utility> #include <limits> #include <iomanip> using namespace std; using ll=long long; template<class T> using V = vector<T>; template<class T, class U> using P = pair<T, U>; using vll = V<ll>; using vvll = V<vll>; #define rep(i, k, n) for (ll i=k; i<(ll)n; ++i) #define REP(i, n) rep(i, 0, n) #define ALL(v) v.begin(),v.end() template<class T> inline bool chmax(T& a, T b) {if (a<b) {a=b; return true;} return false;} template<class T> inline bool chmin(T& a, T b) {if (a>b) {a=b; return true;} return false;} const ll MOD = 1000000007; const ll HIGHINF = (ll)1e18; int main() { cin.tie(0); ios::sync_with_stdio(false); ll n; cin >> n; vvll a(n); vll p(n); REP(i, n) { cin >> p[i]; a[i].resize(p[i]); REP(j, p[i]) cin >> a[i][j]; } vll ai(n, 0); vll ans; bool is_exist = true; while (is_exist) { is_exist = false; REP(i, n) { if (ai[i] == p[i]) continue; else { is_exist = true; ans.push_back(a[i][ai[i]]); ai[i]++; } } } REP(i, ans.size()) cout << ans[i] << (i==ans.size()-1?'\n':' '); return 0; }