#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;
}