#include <bits/stdc++.h>
const long long mo = 1e9 + 7;
using namespace std;
struct st {
  long long a[3][3];
};
int n, i, j, t, p[710], b[710];
long long ans, f[710][710][3][3];
char s[710];
long long go(int x, int y, int c1, int c2) {
  if (f[x][y][c1][c2]) return f[x][y][c1][c2];
  if (p[x] == y) {
    if ((c1 && c2) || (!c1 && !c2)) return 0;
    if (y - x == 1) return 1;
    for (int i = 0; i <= 2; i++)
      for (int j = 0; j <= 2; j++)
        if (!((c1 && c1 == i) || (c2 && c2 == j)))
          f[x][y][c1][c2] = (f[x][y][c1][c2] + go(x + 1, y - 1, i, j)) % mo;
  } else {
    st t, g;
    for (int i = 0; i <= 2; i++) t.a[c1][i] = go(x, p[x], c1, i);
    for (int k = p[x] + 1; k < y; k = p[k] + 1) {
      for (int i = 0; i <= 2; i++) g.a[c1][i] = 0;
      for (int i = 0; i <= 2; i++)
        for (int j = 0; j <= 2; j++) {
          int z = go(k, p[k], i, j);
          for (int x = 0; x <= 2; x++)
            if (!(x == i && x)) g.a[c1][j] = (g.a[c1][j] + t.a[c1][x] * z) % mo;
        }
      for (int i = 0; i <= 2; i++) t.a[c1][i] = g.a[c1][i];
    }
    f[x][y][c1][c2] = t.a[c1][c2];
  }
  return f[x][y][c1][c2];
}
int main() {
  scanf("%s", s + 1);
  n = strlen(s + 1);
  for (i = 1; i <= n; i++)
    if (s[i] == '(')
      b[++t] = i;
    else
      p[b[t--]] = i;
  for (i = 0; i <= 2; i++)
    for (j = 0; j <= 2; j++) ans = (ans + go(1, n, i, j)) % mo;
  printf("%I64d", ans);
}
