#include <bits/stdc++.h>
using namespace std;
const int maxn = 700 + 10;
const long long INF = 1e17;
const int MAX_LOG_N = 20;
const double eps = 1e-6;
const int mod = 1e9 + 7;
int n;
int match[maxn];
long long dp[maxn][maxn][3][3];
char s[maxn];
void dfs(int l, int r) {
  if (l + 1 == r) {
    dp[l][r][0][1] = dp[l][r][0][2] = 1;
    dp[l][r][1][0] = dp[l][r][2][0] = 1;
  } else if (match[l] == r) {
    dfs(l + 1, r - 1);
    for (int i = 0; i <= 2; i++) {
      for (int j = 0; j <= 2; j++) {
        if (i != 1)
          dp[l][r][1][0] = (dp[l][r][1][0] + dp[l + 1][r - 1][i][j]) % mod;
        if (j != 1)
          dp[l][r][0][1] = (dp[l][r][0][1] + dp[l + 1][r - 1][i][j]) % mod;
        if (i != 2)
          dp[l][r][2][0] = (dp[l][r][2][0] + dp[l + 1][r - 1][i][j]) % mod;
        if (j != 2)
          dp[l][r][0][2] = (dp[l][r][0][2] + dp[l + 1][r - 1][i][j]) % mod;
      }
    }
  } else {
    dfs(l, match[l]);
    dfs(match[l] + 1, r);
    for (int i = 0; i <= 2; i++) {
      for (int j = 0; j <= 2; j++) {
        for (int k = 0; k <= 2; k++) {
          for (int p = 0; p <= 2; p++) {
            if ((j == 1 && k == 1) || (j == 2 && k == 2)) continue;
            dp[l][r][i][p] =
                (dp[l][r][i][p] % mod +
                 dp[l][match[l]][i][j] * dp[match[l] + 1][r][k][p] % mod) %
                mod;
          }
        }
      }
    }
  }
}
void solve() {
  scanf("%s", s + 1);
  n = strlen(s + 1);
  stack<int> pos;
  for (int i = 1; i <= n; i++) {
    if (s[i] == '(')
      pos.emplace(i);
    else {
      match[pos.top()] = i;
      pos.pop();
    }
  }
  dfs(1, n);
  long long res = 0;
  for (int i = 0; i <= 2; i++) {
    for (int j = 0; j <= 2; j++) {
      res = (res + dp[1][n][i][j]) % mod;
    }
  }
  printf("%lld\n", res);
}
int main() {
  int t = 1;
  while (t--) {
    solve();
  }
  return 0;
}
