import java.util.ArrayDeque;
import java.util.Deque;
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Deque<Character> staCharacters = new ArrayDeque<>();
        Scanner scanner = new Scanner(System.in);
        String string = scanner.next();
        for (int i = 0; i < string.length(); i++) {
            char c = string.charAt(i);
            if (c == '(' || c == '[') {
                staCharacters.push(c);
            }
            if (c == ')') {
                if (staCharacters.isEmpty()) {
                    System.out.println("false");
                    return;
                } else {
                    if (staCharacters.peek() != '(') {
                        System.out.println("false");
                        return ;
                    } else {
                        staCharacters.pop();
                    }

                }
            } else if (c == ']') {
                if (staCharacters.isEmpty()) {
                    System.out.println("false");
                    return;
                } else {
                    if (staCharacters.peek() != '[') {
                        System.out.println("false");
                        return ;
                    } else {
                        staCharacters.pop();
                    }

                }
            }
        }
        System.out.println("true");

    }

}

括号匹配的思想其实不难,就是检索字符串的每一个字符,如果是'('或'[',就压入栈中,如果是')'或']'就判断栈顶元素是否为对应的左括号,不过不是对应的那么就是false,如果是,那就弹出,继续判断,一直到最后都没有问题就返回true