#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int m = 2e3;
struct block
{
int n;
block *pre , *nex;
char c[2005];
block()
{
n = 0;
pre = nex = nullptr;
memset(c , 0 , sizeof(c));
}
} bl[10005];
int cnt = 1;
block *cur = &bl[1] , *head = cur;
int k = 0;
void link(block *x , block *y)
{
x -> nex = y;
y -> pre = x;
}
block* create(block *x)
{
block *t = &bl[++ cnt];
t -> nex = x -> nex;
link(x , t);
return t;
}
void split(block *x , int p)
{
block *t = create(x);
copy(x -> c + p + 1 , x -> c + x -> n + 1 , t -> c + 1);
t -> n = x -> n - p;
x -> n = p;
}
void move()
{
int x; scanf("%d" , &x);
if (!head -> n) return;
cur = head; k = 0;
int sum = 0;
while (cur -> nex != nullptr && sum + cur -> n <= x)
{
sum += cur -> n;
cur = cur -> nex;
}
k = x - sum;
}
void insert()
{
int n; scanf("%d" , &n);
split(cur , k);
block *t = cur;
while (n --)
{
char x = getchar();
while (x < 32 || x > 126) x = getchar();
if (t -> n == m) t = create(t);
t -> c[++ t -> n] = x;
}
}
void del()
{
int x; scanf("%d" , &x);
split(cur , k);
block *t = cur -> nex;
int sum = 0;
while (t != nullptr && sum + t -> n <= x)
{
sum += t -> n;
t = t -> nex;
}
if (t == nullptr)
{
cur -> nex = nullptr;
return;
}
if (sum < x) split(t , x - sum);
if (!cur -> n && cur -> pre != nullptr) cur = cur -> pre;
link(cur , t -> nex);
}
void get()
{
int x; scanf("%d" , &x);
if (k + x <= cur -> n)
{
for (int i = k + 1; i <= k + x; i++) printf("%c" , cur -> c[i]);
printf("\n");
return;
}
for (int i = k + 1; i <= cur -> n; i++) printf("%c" , cur -> c[i]);
block *t = cur -> nex;
int sum = cur -> n - k;
while (t != nullptr && sum + t -> n <= x)
{
for (int i = 1; i <= t -> n; i++) printf("%c" , t -> c[i]);
sum += t -> n;
t = t -> nex;
}
if (t != nullptr)
for (int i = 1; i <= x - sum; i++) printf("%c" , t -> c[i]);
printf("\n");
}
void backward()
{
if (k)
{
k --;
return;
}
do
{
cur = cur -> pre;
k = cur -> n - 1;
} while (cur -> pre != nullptr && !cur -> n);
}
void forward()
{
if (k < cur -> n)
{
k ++;
return;
}
do
{
cur = cur -> nex;
k = 1;
} while (cur -> nex != nullptr && !cur -> n);
}
int main()
{
int t; scanf("%d" , &t);
while (t --)
{
string op; cin >> op;
if (op[0] == 'M') move();
else if (op[0] == 'I') insert();
else if (op[0] == 'D') del();
else if (op[0] == 'G') get();
else if (op[0] == 'P') backward();
else if (op[0] == 'N') forward();
}
return 0;
}