#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

#define MAX 10000

// Stack structure for operators
char *stack[MAX];
int top = -1;

// Push to stack
void push(char *token) {
    stack[++top] = token;
}

// Pop from stack
char *pop() {
    if (top == -1) return NULL;
    return stack[top--];
}

// Peek at top of stack
char *peek() {
    if (top == -1) return NULL;
    return stack[top];
}

// Check if token is an operator
int isOperator(const char *token) {
    return (strcmp(token, "AND") == 0 || strcmp(token, "OR") == 0 || strcmp(token, "NOT") == 0);
}

// Operator precedence
int precedence(const char *op) {
    if (strcmp(op, "NOT") == 0) return 3;
    if (strcmp(op, "AND") == 0) return 2;
    if (strcmp(op, "OR") == 0) return 1;
    return 0;
}

// Associativity (1 = right, 0 = left)
int isRightAssociative(const char *op) {
    return (strcmp(op, "NOT") == 0);
}

// Split string into tokens
char *nextToken(char **input) {
    while (**input == ' ') (*input)++;  // Skip spaces
    if (**input == '\0') return NULL;

    static char token[MAX];
    int i = 0;

    if (**input == '(' || **input == ')') {
        token[i++] = *((*input)++);
    } else if (isalpha(**input)) {
        while (isalpha(**input)) {
            token[i++] = toupper(*((*input)++));
        }
    } else {
        return NULL;  // Invalid token
    }

    token[i] = '\0';
    return strcmp(token);
}

// Main function
int main() {
    char line[MAX * 2];
    fgets(line, sizeof(line), stdin);

    char *input = line;
    char *output[MAX];
    int outIndex = 0;

    char *token;
    while ((token = nextToken(&input)) != NULL) {
        if (isalpha(token[0]) && strlen(token) == 1) {
            // Operand
            output[outIndex++] = token;
        } else if (strcmp(token, "(") == 0) {
            push(token);
        } else if (strcmp(token, ")") == 0) {
            while (top != -1 && strcmp(peek(), "(") != 0) {
                output[outIndex++] = pop();
            }
            if (top == -1 || strcmp(pop(), "(") != 0) {
                printf("Invalid input\n");
                return 0;  // Unmatched parenthesis
            }
        } else if (isOperator(token)) {
            while (top != -1 && isOperator(peek()) &&
                   ((precedence(peek()) > precedence(token)) ||
                    (precedence(peek()) == precedence(token) && !isRightAssociative(token)))) {
                output[outIndex++] = pop();
            }
            push(token);
        } else {
            printf("Invalid input\n");
            return 0;
        }
    }

    // Pop remaining operators
    while (top != -1) {
        if (strcmp(peek(), "(") == 0 || strcmp(peek(), ")") == 0) {
            printf("Invalid input\n");
            return 0;
        }
        output[outIndex++] = pop();
    }

    // Print result
    for (int i = 0; i < outIndex; i++) {
        printf("%s ", output[i]);
    }

    printf("\n");
    return 0;
}