#include <stdio.h>
#define MaxSize 10000

//定义栈
struct SqStack{
    int top;
    char data[MaxSize];
};

//初始化栈
void InitStack(struct SqStack *S ){
    S->top = -1;
}

//判断栈空
int EmptyStack(struct SqStack S){
    if(S.top == -1){
        return 1;
    }
    else{
        return 0;
    }
}

//入栈
int Push(struct SqStack *S,char c){
    if(S->top == MaxSize - 1){
        return 0;
    }
    else{
        S->top ++;
        S->data[S->top] = c;
        return 1;
    }
}

//出栈
int Pop(struct SqStack *S,char *c){
    if(S->top == -1){
        return 0;
    }
    else{
        *c = S->data[S->top --];
        return 1;
    }
}

//取栈顶元素
int Top(struct SqStack S,char *c){
   if(S.top == -1){
    return 0;
   }
   else{
    *c = S.data[S.top];
    return 1;
   }
}


int main() {
    char s[MaxSize + 2] = "";
    scanf("%s",s);

    struct SqStack S;
    InitStack(&S);
    int flag = 1;
    for(int i = 0; i < MaxSize + 2 && s[i] != '\0'; i ++){
        if(s[i] == '(' || s[i] == '[') {
            Push(&S, s[i]);
        }
        if(s[i] == ')' || s[i] == ']'){
            char C;
            int r = Pop(&S,&C);
            if(r == 0){
                flag = 0;
                break;
            }
            if((s[i] == ')' && C == '[') || (s[i]) == ']' && C == '('){
                flag = 0;
                break;
            }
        }
    }
    if(!EmptyStack(S)){
        flag = 0;
    }
    
    if(flag == 0){
        printf("false\n");
    }
    else{
        printf("true\n");
    }
    
    return 0;
}