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

struct node {
  char *data;
  struct node *next;
  struct node *prev;
};

void push_head(struct node **root, char *data) {
  struct node *p;
  if ((p = malloc(sizeof(struct node))) != 0) {
    p->data = data;
    if (*root == 0) {
      p->next = p;
      p->prev = p;
    } else {
      p->next = *root;
      p->prev = (*root)->prev;
      p->prev->next = p;
      p->next->prev = p;
    }
    *root = p;
  }
}

void push_tail(struct node **root, char *data) {
  struct node *p;
  if ((p = malloc(sizeof(struct node))) != 0) {
    p->data = data;
    if (*root == 0) {
      p->next = p;
      p->prev = p;
      *root = p;
    } else {
      p->next = *root;
      p->prev = (*root)->prev;
      p->prev->next = p;
      p->next->prev = p;
    }
  }
}

char *pop(struct node **root) {
  char *r;
  struct node *p;
  if (*root == 0)
    return 0;
  p = *root;
  r = p->data;
  if (p->next == p) {
    *root = 0;
    free(p);
  } else {
    p->next->prev = p->prev;
    p->prev->next = p->next;
    *root = p->next;
    free(p);
  }
  return r;
}

#define BUFFSIZE 1024
int main(int argc, char *argv[]) {
  struct node *rootS = 0;
  static char buff[BUFFSIZE];
  char *p;
  int flag_reverse;
  int flagsig;
  if (argc != 2) {
  usage:
    fprintf(stderr, "usage: %s -r/f.\n option -r:reverse, -f:forward\n", argv[0]);
    exit(1);
  }
  if (*argv[1] == '-') {
    if (*(argv[1] + 1) == 'f')
      flag_reverse = 0;
    else if (*(argv[1] + 1) == 'r')
      flag_reverse = 1;
    else
      goto usage;
  } else {
    goto usage;
  }
  rootS = 0;
  for (;fgets(buff, BUFFSIZE, stdin);) {
    if ((p = malloc(strlen(buff) + 1)) != 0)
      strcpy(p, buff);
      if (flag_reverse)
        push_head(&rootS, p);
      else
        push_tail(&rootS, p);
  }
  putchar('\n');
  while ((p = pop(&rootS)) != 0) {
    printf("%s", p);
    free(p);
  }
  return 0;
}
/* end */
