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

typedef struct Node {
    int key;
    struct Node *prev, *next;
} node;

node *nil;

// 番兵を示すNILのノードを生成し、prevとnextを番兵につなぐ
void init() {
    nil = (node *)malloc(sizeof(node));
    nil->prev = nil;
    nil->next = nil;
}

// 与えられたキーを持つノードを生成し、それをリストの先頭に追加する
void insert(int key) {
    node *x = (node *)malloc(sizeof(node));
    x->key = key;
    x->next = nil->next;
    nil->next->prev = x;
    nil->next = x;
    x->prev = nil;
}

// 与えられたキーを持つノードを探し、そのポインタを返す
node* listSearch(int key) {
    // NILLの次のノードから調べていく
    node *cur = nil->next;
    while(cur != nil && cur->key != key) {
        cur = cur->next;
    }
    return cur;
}

// 指定されたノードtを削除する
void deleteNode(node* t) {
    if(t == nil) return;
    t->prev->next = t->next;
    t->next->prev = t->prev;
    free(t);
}

// 指定されたキーを持つ要素を削除する
void delete(int key) {
    deleteNode(listSearch(key));
}

// リストの先頭要素を削除する
void deleteFirst() {
    deleteNode(nil->next);
}

// リストの末尾要素を削除する
void deleteLast() {
    deleteNode(nil->prev);
}

// リストの要素をすべて表示する
void printList() {
    int isf=0;
    node *cur = nil->next;
    if(cur == nil) return;
    while(cur != nil) {
        if(isf) printf(" ");
        printf("%d", cur->key);
        cur = cur->next;
        isf++;
    }
    printf("\n");
}

int main()
{
    int N, key, i, j, size=0;
    char str[20];
    init();

    scanf("%d", &N);
    for(i=0; i < N; i++){
        scanf("%s", str);
        
        if(str[0] == 'i') {
            scanf("%d", &key);
            insert(key);
            size++;
        } else if(str[0] == 'd' && str[6] == 'F' && size > 0) {
            deleteFirst();
            size--;
        } else if(str[0] == 'd' && str[6] == 'L' && size > 0) {
            deleteLast();
            size--;
        } else if(str[0] == 'd' && size > 0){
            scanf("%d", &key);
            delete(key);
            size--;
        } else {
            continue;
        }
    }

    printList();
    return 0;
}

