#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
#define MAX_SIZE 1000
typedef struct {
    char array[MAX_SIZE];
    int top;
}CharStack;
void initStack(CharStack*stack) {
    stack->top=-1;
}
void push(CharStack*stack,char value)
{
    if(stack->top<MAX_SIZE-1) {
        stack->array[++(stack->top)]=value;
    }
}
char pop(CharStack*stack) {
    if(stack->top >= 0) {
        return stack->array[(stack->top)--];
    }
    return '\0';
}
int isEmpty(CharStack*stack) {
    return stack->top==-1;
}
int isOperator(char c) {
    return c =='+' || c =='-' || c == '*' || c == '/' || c =='^';
}
char*prefixToPostfix(const char*expression) {
    static char result[MAX_SIZE];
    CharStack stack;
    initStack(&stack);
    int j = 0;
    for(int i = strlen(expression) -1; i >= 0; i--) {
        char c = expression[i];
        if(isspace(c)) {
            continue;
        }
        if(isalnum(c)) {
            push(&stack,c);
        }else if(isOperator(c)) {
            if(stack.top<1) {
                return "Invalid input";
            }
            char op1=pop(&stack);
            char op2=pop(&stack);
            
            result[j++]=op1;
            result[j++]=op2;
            result[j++]=c;
            push(&stack,result[j-1]);
        }else {
            return "Invalid input";
        }
    }while(!isEmpty(&stack)) { 
        result[j++]=pop(&stack);
    }
    result[j]='\0';
    for (int k = 0; k < j/2; k++) {
        char temp = result[k];
        result[k] = result[j-k-1];
        result[j-k-1] = temp;
    }
    return result;
}
int main() {
    char prefixExpression[MAX_SIZE];
    fgets(prefixExpression,sizeof(prefixExpression), stdin);
    size_t len = strlen(prehixExpression); if(len>0 && prefixExpression[len - 1] == '\n') {
        prefixExpression[len - 1] = '\0';
    }
    char*postfixExpression = predixToPostfix(prefixExpression);
    printf("%s\n", postfixExpression);
    return 0;
}