#include <bits/stdc++.h>
using namespace std;
int readint() {
  char c;
  while (c = getchar(), (c < '0' || c > '9') && c != '-')
    ;
  bool flag = (c == '-');
  if (flag) c = getchar();
  int x = 0;
  while (c >= '0' && c <= '9') {
    x = x * 10 + c - 48;
    c = getchar();
  }
  return flag ? -x : x;
}
inline string tos(int x) {
  string s;
  while (x) s = (char)(x % 10 + '0') + s, x /= 10;
  return s;
}
inline int pt(int a[], int l, int r) {
  int p, i, j;
  p = a[l];
  i = l;
  j = r + 1;
  for (;;) {
    while (a[++i] < p)
      if (i >= r) break;
    while (a[--j] > p)
      if (j <= l) break;
    if (i >= j)
      break;
    else
      swap(a[i], a[j]);
  }
  if (j == l) return j;
  swap(a[l], a[j]);
  return j;
}
inline void q_sort(int a[], int l, int r) {
  int q;
  if (r > l) {
    q = pt(a, l, r);
    q_sort(a, l, q - 1);
    q_sort(a, q + 1, r);
  }
}
const int mod = 1000000007;
bool ok[707][707];
bool lok[707][707];
long long dp[707][707][3][3];
stack<int> st;
int dy[707];
string s;
int n;
inline void read(int *a) {
  char c = 0;
  while (c < 33) c = getchar();
  *a = 0;
  while (c > 33) *a = *a * 10 + c - '0', c = getchar();
}
inline void write(int a) {
  if (a > 0) {
    char s[10], k = 0;
    while (a > 0) s[k++] = a % 10 + '0', a /= 10;
    for (char i = k - 1; i >= 0; i--) putchar(s[i]);
  } else
    putchar('0');
  putchar(' ');
}
void ne() {
  for (int i = 0; i < s.size(); i++) {
    if (s[i] == '(')
      st.push(i);
    else {
      dy[i] = st.top();
      dy[st.top()] = i;
      st.pop();
    }
  }
}
inline bool chk(int x, int y) {
  int need = 0;
  for (int i = x; i <= y; i++) {
    if (s[i] == '(')
      need++;
    else
      need--;
    if (need < 0) {
      return 0;
    }
  }
  if (need) return 0;
  return 1;
}
inline void dfs(int l, int r) {
  int i, j, k, p, q;
  if (l + 1 == r) {
    dp[l][r][0][1] = dp[l][r][1][0] = 1;
    dp[l][r][0][2] = dp[l][r][2][0] = 1;
    return;
  }
  if (dy[l] == r) {
    dfs(l + 1, r - 1);
    for (i = 0; i < 3; i++) {
      for (j = 0; j < 3; j++) {
        if (j != 1)
          dp[l][r][0][1] = (dp[l][r][0][1] + 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;
        if (i != 1)
          dp[l][r][1][0] = (dp[l][r][1][0] + 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;
      }
    }
    return;
  }
  k = dy[l];
  dfs(l, k);
  dfs(k + 1, r);
  for (i = 0; i < 3; i++)
    for (j = 0; j < 3; j++)
      for (p = 0; p < 3; p++)
        for (q = 0; q < 3; q++)
          if (!(p == 1 && q == 1) && !(p == 2 && q == 2))
            dp[l][r][i][j] =
                (dp[l][r][i][j] +
                 (dp[l][k][i][p] * dp[k + 1][r][q][j]) % 1000000007) %
                1000000007;
  return;
}
int main() {
  ios_base::sync_with_stdio(false);
  cin >> s;
  if (s == "()") {
    cout << 4 << endl;
    return 0;
  }
  n = s.size();
  ne();
  int i, j, x, y, k, p, q;
  dfs(0, n - 1);
  int ans = 0;
  for (i = 0; i < 3; i++)
    for (j = 0; j < 3; j++) {
      ans += dp[0][n - 1][i][j];
      if (ans >= 1000000007) ans -= 1000000007;
    }
  cout << ans << endl;
  return 0;
}
