#include<stdio.h>
#include<string.h>//必要
#include<stdlib.h>//必要

struct Node{
  unsigned int key;
  struct Node *next;
  struct Node *prev;
};

typedef struct Node * NodePointer;
NodePointer nil;
//---------------------------------------------------

void Init(){//nilは最初と最後に存在
  nil = malloc(sizeof(struct Node));
  nil->next = nil;
  nil->prev = nil;
}

NodePointer ListSearch(int key){//keyに一致するノードがあったらそれを返す
  NodePointer p;
  for(p=nil->next;p!=nil;p=p->next){
    if(p->key==key)break; 
  }
  return p; 
}

void PrintList(){//空白で区切る
  NodePointer p = nil->next;
  int i=1;
   
  while(1){
    if ( p == nil ) break;//最後まで行った
    if ( i == 0)  printf(" ");
    printf("%d", p->key);
    
    p = p->next;
    i = 0;
  }
  printf("\n");
}

void DeleteNode(NodePointer t){
  if(t==nil)return;
  t->next->prev=t->prev;
  t->prev->next=t->next;
  free(t);
}

void DeleteFirst(){
  DeleteNode(nil->next);
}

void DeleteLast(){
  DeleteNode(nil->prev);
}
  

void Delete(int key){//keyのノード削除
  DeleteNode(ListSearch(key));
}


void Insert(int key){
  NodePointer x;
  x = malloc(sizeof(struct Node));
  x->key = key;
  x->next=nil->next;
  x->prev=nil;
  nil->next->prev=x;
  nil->next=x;
}

int main(){
  int key, n, i;
  int size = 0;
  char com[20];
  
  
  scanf("%d", &n);

  Init();//必要

  for ( i = 0; i < n; i++ ){
    scanf("%s%d", com, &key);
    if ( com[0] == 'i' ){//insert
      Insert(key);
    }
    else if ( com[0] == 'd' ){
      if (strlen(com) > 6){
	if ( com[6] == 'F' ) DeleteFirst();//deleteF
	else if ( com[6] == 'L' ) DeleteLast();//deleteL
      }
      else{
	Delete(key);//delete
      }
      size--;
    }
  }

  PrintList();
  return 0;
}
/*
  nilは最初と最後に存在
  コマンド数
  コマンド　値
  コマンド　値
  で繰り返す

  出力　リスト内のキーを順番に出力

*/

