#include <bits/stdc++.h>
using namespace std;
bool delimiter, unof = 0;
inline namespace IO {
template <class t>
using con = vector<t>;
template <class t, class u>
using pi = pair<t, u>;
template <class t, class u>
istream& operator>>(istream& is, pi<t, u>& pr) {
  is >> pr.first >> pr.second;
  return is;
}
template <class t, class u>
ostream& operator<<(ostream& os, const pi<t, u>& pr) {
  delimiter = 0;
  os << (unof ? "\t{" : "") << pr.first << (unof ? " , " : " ") << pr.second
     << (unof ? "}" : "");
  return os;
}
template <class t>
istream& operator>>(istream& is, con<t>& v) {
  for (auto& i : v) is >> i;
  return is;
}
template <class t>
ostream& operator<<(ostream& os, const con<t>& v) {
  delimiter = 1;
  os << (unof ? "[" : "");
  bool fst = 0;
  for (auto e : v)
    os << (unof and fst ? ", " : "") << e << (delimiter ? ' ' : '\n'), fst = 1;
  os << (unof ? "]" : "");
  return os;
}
}  // namespace IO
const int N = 709, mod = 1e9 + 7;
string s;
int closed[N];
int add(long long x, long long y) {
  long long ret = x + y;
  while (ret >= mod) ret -= mod;
  return ret;
}
int mul(long long x, long long y) {
  long long ret = x * y;
  if (ret >= mod) ret %= mod;
  return ret;
}
const int no = 0;
long long dp[N][3][N][3];
long long go(int l, int lc, int r, int rc) {
  if (r < l) return 1;
  long long& ret = dp[l][lc][r][rc];
  if (~ret) return ret;
  ret = 0;
  for (int cur_color = 1; cur_color < 3; ++cur_color) {
    if (lc != cur_color) {
      long long cur = go(l + 1, cur_color, closed[l] - 1, no);
      if (closed[l] + 1 < r) {
        cur = mul(cur, go(closed[l] + 1, no, r, rc));
      }
      ret = add(ret, cur);
    }
    if (closed[l] + 1 < r) {
      long long cur = go(l + 1, no, closed[l] - 1, cur_color);
      cur = mul(cur, go(closed[l] + 1, cur_color, r, rc));
      ret = add(ret, cur);
    } else if (rc != cur_color) {
      long long cur = go(l + 1, no, closed[l] - 1, cur_color);
      ret = add(ret, cur);
    }
  }
  return ret;
}
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  cin >> s;
  stack<pi<char, int>> stk;
  for (int i = 0; i < s.length(); ++i) {
    if (stk.empty())
      stk.push({s[i], i});
    else if (stk.top().first == '(' and s[i] == ')') {
      closed[stk.top().second] = i;
      stk.pop();
    } else {
      stk.push({s[i], i});
    }
  }
  memset(dp, -1, sizeof dp);
  cout << go(0, no, s.length() - 1, no);
  return 0;
}
