#include <bits/stdc++.h>
using namespace std;
char a[750];
int n;
int ind[750];
int b[750];
long long dp[750][750][3][3];
void dfs(int l, int r) {
  if (l + 1 == r) {
    dp[l][r][0][1] = 1;
    dp[l][r][1][0] = 1;
    dp[l][r][2][0] = 1;
    dp[l][r][0][2] = 1;
    return;
  }
  if (ind[l] == r) {
    dfs(l + 1, r - 1);
    for (int i = 0; i < 3; i++)
      for (int j = 0; j < 3; j++) {
        if (i != 1)
          dp[l][r][1][0] =
              (dp[l][r][1][0] + dp[l + 1][r - 1][i][j]) % 1000000007;
        if (j != 1)
          dp[l][r][0][1] =
              (dp[l][r][0][1] + dp[l + 1][r - 1][i][j]) % 1000000007;
        if (i != 2)
          dp[l][r][2][0] =
              (dp[l][r][2][0] + dp[l + 1][r - 1][i][j]) % 1000000007;
        if (j != 2)
          dp[l][r][0][2] =
              (dp[l][r][0][2] + dp[l + 1][r - 1][i][j]) % 1000000007;
      }
  } else {
    int pos = ind[l];
    dfs(l, pos);
    dfs(pos + 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 != k || (j == 0 && k == 0)) {
              dp[l][r][i][p] =
                  (dp[l][r][i][p] +
                   dp[l][pos][i][j] * dp[pos + 1][r][k][p] % 1000000007) %
                  1000000007;
            }
  }
}
int main() {
  while (~scanf("%s", a + 1)) {
    n = strlen(a + 1);
    int k = 0;
    memset(ind, 0, sizeof(ind));
    memset(dp, 0, sizeof(dp));
    for (int i = 1; i <= n; i++)
      if (a[i] == '(')
        b[k++] = i;
      else {
        ind[i] = b[k - 1];
        ind[b[k - 1]] = i;
        k--;
      }
    dfs(1, n);
    long long ans = 0;
    for (int i = 0; i < 3; i++)
      for (int j = 0; j < 3; j++) ans = (ans + dp[1][n][i][j]) % 1000000007;
    printf("%I64d\n", ans);
  }
  return 0;
}
