#include <bits/stdc++.h>
using namespace std;
struct node {
  int x, y, op;
};
unordered_map<string, int> mp;
vector<node> v[105];
int n, m;
long long f[105][105];
bool chk(int x, int y, int l, int r) {
  for (node t : v[x]) {
    if (t.x == t.y) continue;
    int z = t.y;
    if (z == y) {
      if (t.op == 2 || t.op == 4) return false;
    } else if (z < l || z > r) {
      if (t.op <= 3) return false;
    } else if (z >= l && z <= r) {
      if (t.op >= 3) return false;
    }
  }
  return true;
}
bool check(int x, int y, int l, int r) {
  return chk(x, y, l, r) && chk(y, x, l, r);
}
int main() {
  mp["<="] = 1, mp["<"] = 2, mp["="] = 3, mp[">"] = 4, mp[">="] = 5;
  cin >> n >> m;
  string s;
  int x, y;
  for (int i = 1; i <= m; i++) {
    cin >> x >> s >> y;
    int op = mp[s];
    v[x].push_back((node){x, y, op});
    v[y].push_back((node){y, x, 6 - op});
    if (x == y && (op == 2 || op == 4)) {
      puts("0");
      return 0;
    }
  }
  f[0][0] = 1;
  for (int i = 0; i <= n * 2; i++) {
    for (int j = 0; j <= n * 2 - i; j++) {
      if (j >= 2 && check(n * 2 - j + 1, n * 2 - j + 2, i + 1, n * 2 - j + 2))
        f[i][j] += f[i][j - 2];
      if (i >= 1 && j >= 1 && check(i, n * 2 - j + 1, i, n * 2 - j + 1))
        f[i][j] += f[i - 1][j - 1];
      if (i >= 2 && check(i - 1, i, i - 1, n * 2 - j)) f[i][j] += f[i - 2][j];
    }
  }
  long long ans = 0;
  for (int i = 0; i <= 2 * n; i++) {
    ans += f[i][2 * n - i];
  }
  cout << ans / 3 << endl;
  return 0;
}
