# include <cstdio>
# include <queue>
# include <string.h>
# include <stdlib.h>
using namespace std;
# define FIN "nums.in"
# define FOUT "nums.out"
# define max(a, b) (a > b ? a : b)
# define MAX_N 100005
pair <int, int> I;
queue <pair <int, int> > Q;
int A[MAX_N << 1];
char t[MAX_N], *s[MAX_N];
int N, i, j, op, cnt, len, bnd, k;
int ct[MAX_N], *nums[MAX_N], aux[MAX_N];
void radixsort(int len)
{
int cif[10], poz[10], i, p = 0, sum = 0, cur, t = 0;
Q.push(make_pair(1, nums[len][0]));
while (!Q.empty())
{
I = Q.front(); Q.pop();
if (I.first != I.second && p < len)
{
memset(cif, 0, sizeof(cif));
memset(poz, 0, sizeof(poz));
for (i = I.first; i <= I.second; ++i) ++cif[s[nums[len][i]][p] - '0'];
for (i = 1; i <= 9; ++i) cif[i] += cif[i - 1];
for (i = I.first; i <= I.second; ++i)
{
cur = s[nums[len][i]][p] - '0';
++poz[cur];
if (!cur) aux[poz[cur]] = nums[len][i];
else aux[cif[cur - 1] + poz[cur]] = nums[len][i];
}
for (i = I.first; i <= I.second; ++i) nums[len][i] = aux[i - I.first + 1];
if (cif[0]) Q.push(make_pair(I.first, I.first + cif[0] - 1));
for (i = 1; i <= 9; ++i)
if (cif[i] != cif[i - 1]) Q.push(make_pair(I.first + cif[i - 1], I.first + cif[i] - 1));
} else ++t;
sum += I.second - I.first + 1;
if (sum == nums[len][0]) sum = t, ++p;
}
}
void update(int Nod, int St, int Dr, int Pz)
{
if (St == Dr)
{
A[Nod] = 1;
return;
}
int Mij = (St + Dr) >> 1;
if (Pz <= Mij) update(Nod << 1, St, Mij, Pz);
else update(Nod << 1 | 1, Mij + 1, Dr, Pz);
A[Nod] = A[Nod << 1] + A[Nod << 1 | 1];
}
int query(int Nod, int St, int Dr, int K)
{
if (St == Dr) return St;
int Mij = (St + Dr) >> 1;
if (A[Nod << 1] >= K) return query(Nod << 1, St, Mij, K);
else return query(Nod << 1 | 1, Mij + 1, Dr, K - A[Nod << 1]);
}
int main()
{
freopen(FIN, "r", stdin);
freopen(FOUT, "w", stdout);
scanf("%d", &N);
cnt = 0;
for (i = 1; i <= N; ++i)
{
scanf("%d ", &op); gets(t);
if (op == 1)
{
++ct[len = strlen(t)];
bnd = max(bnd, len);
s[++cnt] = (char *) malloc(len + 1);
for (j = 0; j <= len; ++j) s[cnt][j] = t[j];
}
}
for (i = 1; i <= bnd; ++i) nums[i] = (int *) malloc((ct[i] + 1) * sizeof(int)), nums[i][0] = 0;
for (i = 1; i <= cnt; ++i)
{
len = strlen(s[i]);
nums[len][++nums[len][0]] = i;
}
for (i = 1; i <= bnd; ++i)
if (ct[i]) radixsort(i);
/*int dnt = 0;
for (i = 1; i <= bnd; ++i)
if (ct[i])
{
aux[nums[i][1]] = ++dnt;
for (j = 2; j <= nums[i][0]; ++j)
{
for (k = 0; k < i; ++k)
if (s[nums[i][j]][k] != s[nums[i][j - 1]][k]) break;
if (k != i) aux[nums[i][j]] = ++dnt;
else aux[nums[i][j]] = dnt;
}
}
for (i = 1; i <= cnt; ++i) ct[aux[i]] = i;
freopen(FIN, "r", stdin);
scanf("%d", &N);
int c = 0;
for (i = 1; i <= N; ++i)
{
scanf("%d ", &op);
if (op == 1)
{
gets(t);
update(1, 1, dnt, aux[++c]);
} else
{
scanf("%d", &k);
//printf("%s\n", s[ct[query(1, 1, dnt, k)]]);
}
}*/
for (i = 1; i <= cnt; ++i) printf("%s\n", s[i]);
return 0;
}