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

#define MAX_SIZE 100000

typedef struct
{
    char data[MAX_SIZE];
    int top;
} ArrayStack;

//初始化
void initArrayStack(ArrayStack* stack)
{
    stack->top = -1;
}

//判断栈是否为空
bool isEmpty(ArrayStack* stack)
{
    return stack->top == -1;
}

//判断栈是否为满
bool isFull(ArrayStack* stack)
{
    return stack->top == MAX_SIZE - 1;
}

//入栈
void push(ArrayStack* stack, char num)
{
    if(isFull(stack))
    {
        printf("Full\n");
        return;
    }
    //stack->top++;
    //stack->data[stack->top] = num;
    stack->data[++stack->top] = num;
}

//出栈
void pop(ArrayStack* stack)
{
    if(isEmpty(stack))
    {
        printf("Empty\n");
        return;
    }
    stack->top--;
    stack->data[stack->top];
}

//获取栈顶元素
char query(ArrayStack* stack)
{
    if(isEmpty(stack))
    {
        printf("Empty\n");
        return false;
    }
    return stack->data[stack->top];
}

//获取栈的长度
int size(ArrayStack* stack)
{
    return stack->top++;
}

//括号匹配
bool isBracketsBalanced(char* s)
{
    //声明并初始化顺序栈
    ArrayStack stack;
    initArrayStack(&stack);

    for(int i = 0; s[i] != '\0'; i++)
    {
        if(s[i] == '(' || s[i] == '[')//如果遇到左括号'(' '[',压入栈内
        {
            push(&stack, s[i]);
        }
        else if(s[i] == ')' || s[i] == ']')//如果遇到右括号')' ']',检查栈顶元素是否与当前右括号匹配
        {
            if(isEmpty(&stack))//栈为空或栈顶元素不匹配,返回false
            {
                return false;
            }

            char top_element = query(&stack);
            if((s[i] == ')' && top_element != '(')||(s[i] == ']' && top_element != '['))
            {
                return false;
            }
            //如果匹配,弹出栈顶元素继续处理
            pop(&stack);
        }
    }
    //最后检查整个栈是否为空,为空表示所有括号都匹配
    return isEmpty(&stack);
}


int main()
{
    char s[MAX_SIZE] ={'\0'};
    scanf("%s",s);
    getchar();

    if(isBracketsBalanced(s))
    {
        printf("true\n");
    }
    else
    {
        printf("false\n");
    }

    return 0;
}