#include <bits/stdc++.h>
using namespace std;
void assign(long long int pre[9], long long int partial[9], int type) {
  long long int temp[9];
  for (int i = 0; i < 9; i++) temp[i] = 0;
  if (type == 1) {
    for (int i = 0; i < 9; i++) {
      int p = i / 3, q = i % 3;
      for (int j = 0; j < 3; j++) {
        for (int k = 0; k < 3; k++) {
          if (j == 0 || k == 0 || j != k)
            temp[i] += pre[p * 3 + j] * partial[k * 3 + q];
        }
      }
    }
  } else {
    for (int i = 0; i < 9; i++) {
      int p = i / 3, q = i % 3;
      for (int j = 0; j < 3; j++) {
        if (!(p == 0 || j == 0 || p != j)) continue;
        for (int k = 0; k < 3; k++) {
          if (!(q == 0 || k == 0 || q != k)) continue;
          temp[i] += pre[j * 3 + k] * partial[i];
        }
      }
    }
  }
  for (int i = 0; i < 9; i++) partial[i] = temp[i] % 1000000007;
}
int solve(string s) {
  if (s.length() == 0) return 1;
  long long int counters[10001][9];
  int ptr = 0;
  stack<int> stk;
  for (int i = 0; i < s.size(); i++) {
    if (s[i] == '(')
      stk.push(0);
    else {
      int t = stk.top();
      stk.pop();
      long long int partial[9] = {0, 1, 1, 1, 0, 0, 1, 0, 0};
      if (t == 2) {
        assign(counters[ptr - 1], partial, 2);
        stk.pop();
        ptr -= 1;
      }
      while (!stk.empty()) {
        if (stk.top() == 2) {
          assign(counters[ptr - 1], partial, 1);
          stk.pop();
          ptr -= 1;
        } else
          break;
      }
      for (int j = 0; j < 9; j++) {
        counters[ptr][j] = partial[j];
      }
      stk.push(2);
      ptr += 1;
    }
  }
  long long int sum = 0;
  for (int i = 0; i < 9; i++) sum += counters[0][i];
  return sum % 1000000007;
}
int main() {
  string s;
  cin >> s;
  cout << solve(s) << endl;
  return 0;
}
