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



struct List {
    struct List *next;
    void *object;
    } ;


typedef struct __queue {
    struct List *front;
    struct List *back;
    } *Queue;

#define init(queue) do{\
    queue = malloc(sizeof(struct __queue));\
    if (queue == NULL) {\
        perror("initial "#queue" error: ");\
        exit(EXIT_FAILURE);\
        }\
    queue->back = queue->front = NULL;\
    }while (0)


#define empty(queue) (queue->front == NULL)

#define front(queue) (queue->front->object)

void pop(Queue q) {
    void *ans;
    struct List *tmp;
    
    
    if (empty(q))return;
    
    ans = q->front->object;
    tmp = q->front;
    q->front = tmp->next;
    
    free(tmp);
    }

void push(Queue q,void* ob) {
    struct List *tmp;   
    tmp = malloc(sizeof(struct List));
    if (tmp == NULL) {
        perror("push object error: ");
        return;
        }
    tmp->next = NULL;
    tmp->object = ob;
    if (!empty(q))
        q->back->next = tmp;
    else 
        q->front = tmp;

    q->back = tmp;
    }


typedef struct __tree{
    struct __tree *left;
    struct __tree *right;
    int num;
    } *Tree;

void dfs_print(Tree t) {
    printf("%d ",t->num);

    if (t->left != NULL)
        dfs_print(t->left);
    
    if (t->right != NULL)
        dfs_print(t->right);
    }

int main(void) {
    int num,flag_r,flag_l;
    Queue qu;
    Tree T = NULL,*tmp;
    
    init(qu);
    push(qu,&T);
    
    while (!empty(qu)) {
        tmp = front(qu);
        pop(qu);

        *tmp = malloc(sizeof(struct __tree));
        if (*tmp == NULL) {
            perror("add new node error: ");
            continue;
            }
        
        scanf("%d%d%d",&num,&flag_l,&flag_r);
        
        (*tmp)->left = NULL;
        if (flag_l)
            push(qu,&(*tmp)->left);

        (*tmp)->right = NULL;
        if (flag_r)
            push(qu,&(*tmp)->right);

        (*tmp)->num = num;
        }
    dfs_print(T);
    putchar('\n');
    return 0;
    }
