#include <bits/stdc++.h>
using namespace std;
char s[1000];
int p[1000];
long long dp[3][3][705][705];
int main() {
  cin >> s + 1;
  int len = strlen(s + 1);
  stack<int> stk;
  for (int i = 1; i <= len; i++) {
    if (s[i] == '(')
      stk.push(i);
    else {
      p[i] = stk.top();
      p[stk.top()] = i;
      stk.pop();
    }
  }
  memset(dp, 0, sizeof(dp));
  for (int i = 2; i <= len; i++) {
    for (int l = 1; l <= len - i + 1; l++) {
      int m = p[l];
      int r = l + i - 1;
      if (m > l && m != r) {
        for (int j = 0; j < 3; j++) {
          for (int k = 0; k < 3; k++) {
            for (int h = 0; h < 3; h++) {
              for (int g = 0; g < 3; g++) {
                if (h && g && g == h) continue;
                dp[j][k][l][r] += (dp[j][h][l][m] * dp[g][k][m + 1][r]);
                dp[j][k][l][r] %= 1000000007;
              }
            }
          }
        }
      } else if (m == r) {
        if (i == 2) {
          dp[0][1][l][r] = dp[0][2][l][r] = dp[1][0][l][r] = dp[2][0][l][r] = 1;
        } else {
          for (int j = 0; j < 3; j++) {
            for (int k = 0; k < 3; k++) {
              if (j == 0 && k == 0 || j && k) continue;
              for (int h = 0; h < 3; h++) {
                if (j && h && j == h) continue;
                for (int g = 0; g < 3; g++) {
                  if (k && g && k == g) continue;
                  dp[j][k][l][r] += (dp[h][g][l + 1][r - 1]);
                  dp[j][k][l][r] %= 1000000007;
                }
              }
            }
          }
        }
      }
    }
  }
  long long ans = 0;
  for (int i = 0; i < 3; i++) {
    for (int j = 0; j < 3; j++) {
      ans += dp[i][j][1][len];
      ans %= 1000000007;
    }
  }
  cout << ans << endl;
}
