#include <bits/stdc++.h>
using namespace std;
const int maxn = 705;
const int mod = 1e9 + 7;
int num[maxn];
long long dp[maxn][maxn][3][3];
char s[maxn];
bool check(int a, int b) { return a == 0 || b == 0 || a != b; }
long long dfs(int l, int r, int c1, int c2) {
  if (dp[l][r][c1][c2] != -1) return dp[l][r][c1][c2];
  if (l + 1 > r) return dp[l][r][c1][c2] = 0;
  long long ans = 0;
  if (num[l] == r) {
    if ((c1 && c2 == 0) || (c1 == 0 && c2)) {
      if (l + 1 == r) return dp[l][r][c1][c2] = 1;
      for (int i = 0; i < 3; ++i)
        for (int j = 0; j < 3; ++j)
          if (check(c1, i) && check(j, c2))
            ans = (ans + dfs(l + 1, r - 1, i, j) % mod) % mod;
    }
  } else if (num[l] < r) {
    for (int i = 0; i < 3; ++i)
      for (int j = 0; j < 3; ++j)
        if (check(i, j))
          ans =
              (ans + dfs(l, num[l], c1, i) * dfs(num[l] + 1, r, j, c2) % mod) %
              mod;
  }
  return dp[l][r][c1][c2] = ans;
}
int main() {
  scanf("%s", s);
  int len = strlen(s);
  stack<int> ss;
  for (int i = 0; i < len; ++i) {
    if (s[i] == '(')
      ss.push(i);
    else
      num[ss.top()] = i, ss.pop();
  }
  memset(dp, -1, sizeof(dp));
  long long ans = 0;
  for (int i = 0; i < 3; ++i)
    for (int j = 0; j < 3; ++j) ans = (ans + dfs(0, len - 1, i, j) % mod) % mod;
  printf("%lld\n", ans);
}
