#include <bits/stdc++.h>
using namespace std;
template <typename T>
inline bool read(T &x) {
  x = 0;
  bool neg = 0;
  char c = getchar();
  for (; c < '0' || c > '9'; c = getchar())
    if (c == '-')
      neg = 1;
    else if (c == EOF)
      return 0;
  for (; '0' <= c && c <= '9'; c = getchar()) x = x * 10 + (c ^ 48);
  neg ? (x = -x) : 0;
  return c != EOF;
}
template <typename A, typename... B>
inline bool read(A &x, B &...y) {
  return read(x) && read(y...);
}
template <typename T>
inline void write(T x) {
  if (x < 0) putchar('-'), x = -x;
  char st[50];
  int top = 0;
  if (!x) st[++top] = x ^ 48;
  for (; x; x /= 10) st[++top] = (x % 10) ^ 48;
  while (top) putchar(st[top--]);
}
template <typename T>
inline void wln(T x) {
  write(x);
  putchar('\n');
}
const int mod = 1e9 + 7;
const int maxn = 705;
int a[4] = {0, 0, 1, 2};
int b[4] = {1, 2, 0, 0};
int dp[maxn][maxn][3][3];
char s[maxn];
int match[maxn], st[maxn], top = 0;
inline void Add(int &x, int y) {
  x += y;
  x = x < mod ? x : x - mod;
}
inline int mul(int x, int y) { return 1ll * x * y % mod; }
void DP(int l, int r) {
  if (l >= r) return;
  if (l + 1 == r) {
    for (int k = 0; k < 4; k++) dp[l][r][a[k]][b[k]] = 1;
    return;
  }
  if (match[l] == r) {
    DP(l + 1, r - 1);
    for (int k = 0; k < 4; k++)
      for (int i = 0; i < 3; i++) {
        if (a[k] == i && i) continue;
        for (int j = 0; j < 3; j++) {
          if (b[k] == j && j) continue;
          Add(dp[l][r][a[k]][b[k]], dp[l + 1][r - 1][i][j]);
        }
      }
  } else {
    int d = match[l];
    DP(l, d);
    DP(d + 1, r);
    for (int i = 0; i < 3; i++)
      for (int j = 0; j < 3; j++)
        for (int k = 0; k < 3; k++)
          for (int o = 0; o < 3; o++) {
            if (o != 0 && o == k) continue;
            Add(dp[l][r][i][j], mul(dp[l][d][i][k], dp[d + 1][r][o][j]));
          }
  }
}
int main() {
  scanf("%s", s + 1);
  int n = strlen(s + 1);
  for (int i = 1; i <= n; i++) {
    if (s[i] == ')') {
      match[st[top]] = i;
      match[i] = st[top--];
    } else
      st[++top] = i;
  }
  DP(1, n);
  int ans = 0;
  for (int i = 0; i < 3; i++)
    for (int j = 0; j < 3; j++) Add(ans, dp[1][n][i][j]);
  wln(ans);
  return 0;
}
