#include <bits/stdc++.h>
using namespace std;
const int MOD = 1000000007;
const int INF = 0x3f3f3f3f;
const int MAXN = 1010;
int n, k;
long long dp[100][100];
struct Rule {
  int ia, ib;
  string type;
  Rule() {}
  Rule(int _ia, int _ib, string t) {
    ia = _ia;
    ib = _ib;
    type = t;
  }
  bool involve(int p1, int p2) {
    return p1 == ia || p2 == ib || p1 == ib || p2 == ia;
  }
};
Rule rules[105];
bool check(int l, int r, int bl, int br, int p1, int p2) {
  for (int i = 0; i < k; i++) {
    if (rules[i].involve(p1, p2)) {
      if (rules[i].type == "=") {
        if ((p1 != rules[i].ia && p2 != rules[i].ia) ||
            (p2 != rules[i].ib && p1 != rules[i].ib))
          return false;
      } else if (rules[i].type == ">") {
        if ((p1 == rules[i].ia || p2 == rules[i].ia) && rules[i].ib > bl &&
            rules[i].ib < br)
          return false;
        if ((p1 == rules[i].ib || p2 == rules[i].ib) &&
            (rules[i].ia <= l || rules[i].ia >= r))
          return false;
      } else if (rules[i].type == "<") {
        if ((p1 == rules[i].ia || p2 == rules[i].ia) &&
            (rules[i].ib <= l || rules[i].ib >= r))
          return false;
        if ((p1 == rules[i].ib || p2 == rules[i].ib) && rules[i].ia > bl &&
            rules[i].ia < br)
          return false;
      } else if (rules[i].type == ">=") {
        if ((p1 == rules[i].ia || p2 == rules[i].ia) && rules[i].ib > l &&
            rules[i].ib < r)
          return false;
        if ((p1 == rules[i].ib || p2 == rules[i].ib) &&
            (rules[i].ia <= bl || rules[i].ia >= br))
          return false;
      } else {
        if ((p1 == rules[i].ia || p2 == rules[i].ia) &&
            (rules[i].ib <= bl || rules[i].ib >= br))
          return false;
        if ((p1 == rules[i].ib || p2 == rules[i].ib) && rules[i].ia > l &&
            rules[i].ia < r)
          return false;
      }
    }
  }
  return true;
}
long long sum = 0;
void work() {
  for (int l = n - 1; l > 0; l--) {
    for (int left = 0; left <= 2 * n - 2 * l; left++) {
      int right = 2 * l + left + 1;
      if (left > 0 && right <= 2 * n &&
          check(left, right, left - 1, right + 1, left, right)) {
        dp[left][right] += dp[left - 1][right + 1];
      }
      if (left > 1 && check(left, right, left - 2, right, left, left - 1)) {
        dp[left][right] += dp[left - 2][right];
      }
      if (right <= 2 * n - 1 &&
          check(left, right, left, right + 2, right, right + 1)) {
        dp[left][right] += dp[left][right + 2];
      }
    }
  }
  for (int i = 0; i < 2 * n - 1; i++) {
    if (check(i + 1, i + 2, i, i + 3, i + 1, i + 2)) sum += dp[i][i + 3];
  }
  cout << sum << endl;
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.sync_with_stdio(false);
  cout.sync_with_stdio(false);
  cin >> n >> k;
  for (int i = 0; i < k; i++) {
    cin >> rules[i].ia >> rules[i].type >> rules[i].ib;
  }
  dp[0][2 * n + 1] = 1LL;
  work();
  return 0;
}
