#include <bits/stdc++.h>
using namespace std;
int type(int l, int r, int one, int two, int con) {
  if (con < l || con > r)
    return 0;
  else if (con == one || con == two)
    return 1;
  return 2;
}
bool getSign(int a, int b, string sign) {
  if (sign == "=")
    return a == b;
  else if (sign == "<")
    return a < b;
  else if (sign == ">")
    return a > b;
  else if (sign == ">=")
    return a >= b;
  else
    return a <= b;
}
bool valid(int l, int r, int one, int two, int k,
           vector<pair<int, int>> &constraints, vector<string> signs) {
  for (decltype(0) i = 0; i < k; i++) {
    int tp1 = type(l, r, one, two, constraints[i].first);
    int tp2 = type(l, r, one, two, constraints[i].second);
    if (tp1 != 1 && tp2 != 1) continue;
    if (!getSign(tp1, tp2, signs[i])) return false;
  }
  return true;
}
long long int solve(int l, int r, vector<vector<long long int>> &dp, int k,
                    vector<pair<int, int>> &constraints,
                    std::vector<string> &signs) {
  long long int res = 0;
  if (dp[l][r] != -1) return dp[l][r];
  if (l == r - 1) {
    if (valid(l, r, l, l + 1, k, constraints, signs)) res += 1;
  } else {
    if (valid(l, r, l, l + 1, k, constraints, signs))
      res += solve(l + 2, r, dp, k, constraints, signs);
    if (valid(l, r, r, r - 1, k, constraints, signs))
      res += solve(l, r - 2, dp, k, constraints, signs);
    if (valid(l, r, l, r, k, constraints, signs))
      res += solve(l + 1, r - 1, dp, k, constraints, signs);
  }
  dp[l][r] = res;
  return res;
}
int main() {
  int n, k;
  cin >> n >> k;
  n *= 2;
  vector<pair<int, int>> constraints(k + 1);
  std::vector<string> signs(k + 1);
  for (decltype(0) i = 0; i < k; i++) {
    cin >> constraints[i].first >> signs[i] >> constraints[i].second;
  }
  vector<vector<long long int>> dp(n + 1, vector<long long int>(n + 1, -1));
  int one, two;
  long long int result = solve(1, n, dp, k, constraints, signs);
  cout << result << "\n";
}
