#include <bits/stdc++.h>
inline long long read() {
  long long r = 0, f = 0;
  char c;
  while (!isdigit(c = getchar())) f |= (c == '-');
  while (isdigit(c)) r = (r << 1) + (r << 3) + (c ^ 48), c = getchar();
  return f ? -r : r;
}
char s[777];
int n, top, sta[777], nxt[777];
long long ans, f[777][777][3][3];
int main() {
  scanf("%s", s + 1);
  n = strlen(s + 1);
  for (int i = 1; i <= n; i++) {
    if (s[i] == '(')
      sta[++top] = i;
    else
      nxt[sta[top]] = i, top--;
  }
  for (int i = 1; i < n; i++)
    if (s[i] == '(' && s[i + 1] == ')') {
      f[i][i + 1][0][1] = 1;
      f[i][i + 1][0][2] = 1;
      f[i][i + 1][1][0] = 1;
      f[i][i + 1][2][0] = 1;
    }
  nxt[n + 1] = n;
  for (int l = 4; l <= n; l += 2)
    for (int i = 1, j = l; j <= n; i++, j++) {
      if (s[i] == ')' || s[j] == '(') continue;
      if (nxt[i] == j) {
        for (int x = 0; x < 3; x++)
          for (int y = 0; y < 3; y++) {
            if (x && y) continue;
            if (!x && !y) continue;
            for (int p = 0; p < 3; p++)
              for (int q = 0; q < 3; q++) {
                if ((x && x == p) || (y && y == q)) continue;
                (f[i][j][x][y] += f[i + 1][j - 1][p][q]) %= 1000000007;
              }
          }
        continue;
      }
      if (nxt[i] > j) continue;
      for (int x = 0; x < 3; x++) {
        for (int y = 0; y < 3; y++) {
          int k = nxt[i];
          for (int p = 0; p < 3; p++)
            for (int q = 0; q < 3; q++) {
              if (p && p == q) continue;
              (f[i][j][x][y] +=
               (f[i][k][x][p] * f[k + 1][j][q][y]) % 1000000007) %= 1000000007;
            }
        }
      }
    }
  for (int i = 0; i < 3; i++)
    for (int j = 0; j < 3; j++) (ans += f[1][n][i][j]) %= 1000000007;
  printf("%lld\n", ans);
  return 0;
}
