#include<bits/stdc++.h>
using namespace std;
const int sqn = 520;
int cnt, gb, qwq;
struct node{
public:
int nxt, siz;
string vl;
}lis[sqn << 4];
int nw(int qq){
++cnt;
lis[qq].nxt = cnt;
lis[cnt].siz = 0;
lis[cnt].vl = "";
lis[cnt].nxt = -1;
return cnt;
}
void mg(int u, int v){
for (int i = 1; i <= lis[v].siz; i++)
lis[u].vl += lis[v].vl[i];
lis[u].nxt = lis[v].nxt;
lis[u].siz += lis[v].siz;
lis[v].vl = "";
lis[v].siz = 0;
lis[v].nxt = -1;
}
void spt(int u, int k){
int unx = lis[u].nxt;
int nid = nw(u);
string s1 = "", s2 = "";
for (int i = 1; i <= k; i++)
s1 += lis[u].vl[i];
for (int i = k + 1; i <= lis[u].siz; i++)
s2 += lis[u].vl[i];
lis[u].vl = (string)" " + s1;
lis[nid].vl = (string)" " + s2;
lis[u].siz = s1.size();
lis[nid].siz = s2.size();
lis[nid].nxt = unx;
}
string gst(int s_siz){
string res;
char ch;
for (int i = 1; i <= s_siz; i++){
ch = getchar();
if (ch == '\n' || ch == '\r'){
i--;
continue;
}
res += ch;
}
return res;
}
void ins(int u, string x){
if (cnt == 0){
int v = nw(0);
lis[v].vl = " " + x;
lis[v].siz = x.size();
}
int qz = 0, pre = 0;
for (int v = 0; v != -1; v = lis[v].nxt){
if (qz < u && qz + lis[v].siz >= u){
spt(v, u);
lis[v].vl += x;
lis[v].siz += x.size();
if (pre != 0 && lis[pre].siz < lis[lis[v].nxt].siz)
if (lis[v].siz + lis[pre].siz < sqn)
mg(pre, v);
else if (lis[v].nxt != -1)
if (lis[v].siz + lis[lis[v].nxt].siz < sqn)
mg(v, lis[v].nxt);
return;
}
qz += lis[v].siz;
pre = v;
}
}
void bdel(int u, int pre){
lis[pre].nxt = lis[u].nxt;
lis[u].vl = "";
lis[u].siz = 0;
}
void del(int l, int r){
int qz = 0, pre = 0;
for (int v = 0; v != -1; v = lis[v].nxt){
int kr = qz + lis[v].siz;
if (kr < l){
pre = v;
qz += lis[v].siz;
continue;
}
if (qz > r)
break;
if (qz >= l && kr <= r)
bdel(v, pre);
else{
if (qz < l && kr > r){
spt(v, l);
spt(lis[v].nxt, r);
bdel(lis[v].nxt, v);
}else if (qz < l){
spt(v, l);
bdel(v, pre);
}else{
spt(v, r);
bdel(lis[v].nxt, v);
}
if (pre != 0 && lis[pre].siz < lis[lis[v].nxt].siz)
if (lis[v].siz + lis[pre].siz < sqn / 3 * 4)
mg(pre, v);
else if (lis[v].nxt != -1)
if (lis[v].siz + lis[lis[v].nxt].siz < sqn / 3 * 4)
mg(v, lis[v].nxt);
}
pre = v;
qz += lis[v].siz;
}
}
void get(int l, int r){
int qz = 0, pre = 0;
for (int v = 0; v != -1; v = lis[v].nxt){
int kr = qz + lis[v].siz;
if (kr < l){
pre = v;
qz += lis[v].siz;
continue;
}
if (qz > r)
break;
if (qz >= l && kr <= r)
for (int i = 1; i <= lis[v].siz; i++)
cout << lis[v].vl[i];
else{
if (qz < l && kr > r){
for (int i = l; i <= r; i++)
cout << lis[v].vl[i];
}else if (qz < l)
for (int i = l; i <= kr; i++)
cout << lis[v].vl[i];
else
for (int i = qz; i <= r; i++)
cout << lis[v].vl[i];
}
pre = v;
qz += lis[v].siz;
}
}
void prtnow(){
for (int v = 0; v != -1; v = lis[v].nxt)
cout << lis[v].vl;
cout << "\n";
}
int main(){
cin >> qwq;
while (qwq--){
string op;
cin >> op;
if (op == "Insert"){
int lnt;
cin >> lnt;
ins(gb, gst(lnt));
}else if (op == "Delete"){
int x;
cin >> x;
del(gb, gb + x - 1);
}else if (op == "Get"){
int x;
cin >> x;
get(gb, gb + x - 1);
cout << "\n";
}else if (op == "Move"){
int x;
cin >> x;
gb = x;
}else if (op == "Prev")
gb--;
else if (op == "Next")
gb++;
}
}