// P.02.01 (Operations on Singly Linked Lists)
// Code by Vani 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>

typedef struct Node {
    int value;
    struct Node* next;
} Node;

Node* makeNode(int v) {
    Node* p = (Node*)malloc(sizeof(Node));
    if(p == NULL) return NULL;
    p -> value = v;
    p -> next = NULL;
    return p;
}

void printList(Node* h) {
    Node* p = h;
    while(p != NULL) {
        printf("%d ", p -> value);
        p = p -> next;
    }
}

bool find(Node* head, int val) {
    Node* p = head;
    while(p != NULL) {
        if(p -> value == val) return true;
        p = p -> next;
    }
    return false;
}

Node* addFirst(Node* head, int v) {
    if(find(head, v)) return head;
    Node* new_node = makeNode(v);
    new_node -> next = head;
    return new_node;
}

Node* addLast(Node* head, int v) {
    if(find(head, v)) return head;
    Node* new_node = makeNode(v);
    if(head == NULL) return new_node;

    Node* p = head;
    while(p -> next != NULL) p = p -> next;
    p -> next = new_node;
    return head;
}

Node* addAfter(Node* head, int u, int v) {
    if(find(head, u) || !find(head, v)) return head;
    Node* p = head;
    while(p != NULL && p -> value != v) p = p -> next;
    if(p != NULL) {
        Node* new_node = makeNode(u);
        new_node -> next = p -> next;
        p -> next = new_node;
    }
    return head;
}

Node* addBefore(Node* head, int u, int v) {
    if(find(head, u) || !find(head, v)) return head;
    if(head != NULL && head -> value == v) {
        return addFirst(head, u);
    }
    Node* p = head;
    while(p != NULL && p -> next != NULL && p->next->value != v) p = p-> next;
    if(p != NULL && p-> next != NULL) {
        Node* new_node = makeNode(u);
        new_node -> next = p -> next;
        p -> next = new_node;
    }
    return head;
}

Node* removeNode(Node* head, int k) {
    if(head == NULL) return NULL;
    if(head -> value == k) {
        Node* temp = head;
        head = head -> next;
        free(temp);
        return head;
    }
    Node* p = head;
    while(p -> next != NULL && p -> next -> value != k) {
        p = p -> next;
    }
    if(p -> next != NULL) {
        Node* temp = p -> next;
        p -> next = p -> next -> next;
        free(temp);
    }
    return head;
}

Node* reverse(Node* head) {
    Node* prev = NULL;
    Node* current = head;
    Node* next = NULL;
    while(current != NULL) {
        next = current -> next;
        current -> next = prev;
        prev = current;
        current = next;
    }
    return prev;
}

void vaniinput() {
    int n; scanf("%d", &n);
    Node *head = NULL, *tail = NULL;
    for(int i = 0; i < n; i++) {
        int k; scanf("%d", &k);
        Node *new_node = makeNode(k);
        if(head == NULL) {
            head = new_node;
            tail = new_node;
        } else {
            tail -> next = new_node;
            tail = new_node;
        }
    }

    char cmd[50];
    while(scanf("%s", cmd) == 1 && strcmp(cmd, "#") != 0) {
        if(strcmp(cmd, "addlast") == 0) {
            int k; scanf("%d", &k);
            head = addLast(head, k);
        } else if(strcmp(cmd, "addfirst") == 0) {
            int k; scanf("%d", &k);
            head = addFirst(head, k);
        } else if(strcmp(cmd, "addafter") == 0) {
            int u, v; scanf("%d %d", &u, &v);
            head = addAfter(head, u, v);
        } else if(strcmp(cmd, "addbefore") == 0) {
            int u, v; scanf("%d %d", &u, &v);
            head = addBefore(head, u, v);
        } else if(strcmp(cmd, "remove") == 0) {
            int k; scanf("%d", &k);
            head = removeNode(head, k);
        } else if(strcmp(cmd, "reverse") == 0) {
            head = reverse(head);
        }
    }

    printList(head);
}

void vanimain() {
    vaniinput();
}

int main() {
    vanimain();
    return 0;
}
