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

//リストの最大個数
#define MAXLIST 2000000
//コマンドの長さ
#define CMDLENGTH 20

//リストの構造体
typedef struct {
	//キー
	int data;
	//次のアドレス
	int next_key;
	//前のアドレス
	int back_key;
}List;

void insert_key(List list[MAXLIST], int *first_point, int data);
void delete_key(List list[MAXLIST], int *first_point, int *last_point, int data);
void delete_first_key(List list[MAXLIST], int *first_point, int data);
void delete_last_key(List list[MAXLIST], int *last_point, int data);

int main(void)
{
	//リストの生成
	static List list[MAXLIST] = { -1, 1, -1 };
	int i, n;
	//first_pointはリストの先頭を、last_pointはリストの最後尾を格納
	int data, first_point, last_point;
	char cmd[CMDLENGTH];

	//命令の数を入力
	scanf("%d", &n);

	first_point = last_point = 0;

	for (i = 0; i < n; i++) {
		//命令を入力
		scanf("%s", cmd);

		//コマンド毎に関数を呼び出す
		if (!strcmp(cmd, "insert")) {
			//挿入するキーを入力
			scanf("%d", &data);
			insert_key(list, &first_point, data);
		}
		else if (!strcmp(cmd, "deleteFirst")) {
			delete_first_key(list, &first_point, data);
		}
		else if (!strcmp(cmd, "deleteLast")) {
			delete_last_key(list, &last_point, data);
		}
		else if (!strcmp(cmd, "delete")) {
			//削除するキーを入力
			scanf("%d", &data);
			delete_key(list, &first_point, &last_point, data);
		}
	}

	//先頭から最後尾まで結果を出力
	first_point -= 1;
	printf("%d", list[first_point].data);
	i = list[first_point].back_key;
	while (i >= last_point) {
		printf(" %d", list[i].data);
		i = list[i].back_key;
	}
	printf("\n");

	return 0;
}

//キーを挿入
void insert_key(List list[MAXLIST], int *first_point, int data)
{
	int key;

	key = *first_point;
	
	//現在のセルにキーを挿入
	list[*first_point].data = data;
	//次のアドレスを挿入
	list[*first_point].next_key = *first_point + 1;

	//先頭を一つ進める
	*first_point += 1;
	//前のアドレスを挿入
	list[*first_point].back_key = key;
}

//キーを削除
void delete_key(List list[MAXLIST], int *first_point, int *last_point, int data)
{
	int i, next_key, back_key;

	//先頭から最後尾まで繰り返す
	for (i = (*first_point - 1); i >= *last_point; i--) {
		//データが一致する場合
		if (list[i].data == data) {
			//先頭にあれば先頭のキーを削除する関数を呼び出す
			if (i == *first_point - 1) {
				delete_first_key(list, first_point, data);
			}
			//最後にあれば最後のキーを削除する関数を呼び出す
			else if (i == *last_point) {
				delete_last_key(list, last_point, data);
			}
			//それ以外の場合
			else {
				//削除するセルの次のアドレスと前のアドレスを保存
				next_key = list[i].next_key;
				back_key = list[i].back_key;
				//データを削除
				list[i].data = -1;

				//アドレスを更新
				list[back_key].next_key = next_key;
				list[next_key].back_key = back_key;
			}
			//削除したらループ終了
			break;
		}
	}
}

//リストの先頭を削除する
void delete_first_key(List list[MAXLIST], int *first_point, int data)
{
	*first_point -= 1;

	//データを削除し、先頭アドレスを更新する
	list[*first_point].data = -1;
	*first_point = list[*first_point].back_key + 1;
}

//リストの最後尾を削除する
void delete_last_key(List list[MAXLIST], int *last_point, int data)
{
	//データを削除し、最後尾のアドレスを更新する
	list[*last_point].data = -1;
	*last_point = list[*last_point].next_key;
}
