#include <bits/stdc++.h>
using namespace std;
const int maxn = 750;
const int maxm = 200000 + 100;
const int mod = 1000000007;
const int inf = 0x3f3f3f3f;
const double PI = acos(-1.0);
char ch[maxn];
int L[maxn];
long long dp[750][750][3][3];
stack<int> use;
void get(int l, int r) {
  if (r == l + 1) {
    dp[l][r][0][1] = dp[l][r][1][0] = dp[l][r][0][2] = dp[l][r][2][0] = 1;
    return;
  }
  if (L[l] == r) {
    get(l + 1, r - 1);
    for (int i = 0; i < 3; i++) {
      for (int j = 0; j < 3; j++) {
        if (i == j) continue;
        if (i && j) continue;
        for (int k = 0; k < 3; k++) {
          if (i && k && i == k) continue;
          for (int d = 0; d < 3; d++) {
            if (j && d && j == d) continue;
            dp[l][r][i][j] += dp[l + 1][r - 1][k][d];
            dp[l][r][i][j] %= mod;
          }
        }
      }
    }
    return;
  }
  int m = L[l];
  get(l, m);
  get(m + 1, r);
  for (int i = 0; i < 3; i++) {
    for (int j = 0; j < 3; j++) {
      if (i == j) continue;
      if (i && j) continue;
      for (int k = 0; k < 3; k++) {
        if (k > 0 && j > 0 && k == j) continue;
        for (int d = 0; d < 3; d++) {
          dp[l][r][i][d] += dp[l][m][i][j] * dp[m + 1][r][k][d];
          dp[l][r][i][d] %= mod;
        }
      }
    }
  }
}
int main() {
  scanf("%s", ch + 1);
  int n = strlen(ch + 1);
  for (int i = 1; i <= n; i++) {
    if (ch[i] == '(')
      use.push(i);
    else {
      int k = use.top();
      use.pop();
      L[k] = i;
    }
  }
  get(1, n);
  long long ans = 0;
  for (int i = 0; i < 3; i++) {
    for (int j = 0; j < 3; j++) {
      ans += dp[1][n][i][j];
      ans %= mod;
    }
  }
  printf("%lld", ans);
  return 0;
}
