#include <bits/stdc++.h>
#pragma comment(linker, "/STACK:102400000,102400000")
using namespace std;
string s[77][77];
bool cal(string &a, string &b) {
  if (a == "?") {
    a = b;
    return 1;
  }
  if (b == ">") {
    if (a == ">") return 1;
    if (a == ">=") {
      a = b;
      return 1;
    }
  } else if (b == "<") {
    if (a == "<") return 1;
    if (a == "<=") {
      a = b;
      return 1;
    }
  } else if (b == "=") {
    if (a == "=") return 1;
    if (a == ">=" || a == "<=") {
      a = b;
      return 1;
    }
  } else if (b == ">=") {
    if (a == ">=" || a == ">" || a == "=") return 1;
  } else {
    if (a == "<=" || a == "=" || a == "<") return 1;
  }
  return 0;
}
long long dp[75][75][37];
vector<int> v[77];
int n, to[77];
long long dfs(int l, int r, int first) {
  if (l + 1 == r) {
    if (s[l][r] == ">" || s[l][r] == "<") return 0;
    if (to[l] && to[l] != r) return 0;
    if (to[r] && to[r] != l) return 0;
    return 1;
  }
  long long &ret = dp[l][r][first];
  if (ret + 1) return ret;
  ret = 0;
  if ((!to[l] && !to[l + 1]) || to[l] == l + 1) {
    int ok = 1, d[2] = {0, 1};
    if (s[l][l + 1] == ">" || s[l][l + 1] == "<") ok = 0;
    for (int second = 0; second < 2 && ok; second++)
      for (int i = 0; i < v[l + d[second]].size(); i++) {
        if (v[l + d[second]][i] <= r && v[l + d[second]][i] >= l + 2) {
          ok = 0;
          break;
        }
      }
    if (ok) {
      ret += dfs(l + 2, r, first + 1);
    }
  }
  if ((!to[l] && !to[r]) || to[l] == r) {
    int ok = 1, d[2] = {0, r - l};
    if (s[l][r] == ">" || s[l][r] == "<") ok = 0;
    for (int second = 0; second < 2 && ok; second++)
      for (int i = 0; i < v[l + d[second]].size(); i++) {
        if (v[l + d[second]][i] <= r - 1 && v[l + d[second]][i] >= l + 1) {
          ok = 0;
          break;
        }
      }
    if (ok) {
      ret += dfs(l + 1, r - 1, first + 1);
    }
  }
  if ((!to[r - 1] && !to[r]) || to[r - 1] == r) {
    int ok = 1, d[2] = {r - l - 1, r - l};
    if (s[r - 1][r] == ">" || s[r - 1][r] == "<") ok = 0;
    for (int second = 0; second < 2 && ok; second++)
      for (int i = 0; i < v[l + d[second]].size(); i++) {
        if (v[l + d[second]][i] >= l && v[l + d[second]][i] <= r - 2) {
          ok = 0;
          break;
        }
      }
    if (ok) {
      ret += dfs(l, r - 2, first + 1);
    }
  }
  return ret;
}
int main() {
  int m, i, j, k;
  scanf("%d%d", &n, &m);
  for (i = 1; i <= 2 * n; i++)
    for (j = 1; j <= 2 * n; j++) s[i][j] = "?";
  int ok = 1;
  for (int it = 0; it < m; it++) {
    string t;
    cin >> i >> t >> j;
    if (!ok) continue;
    if (i > j) {
      if (t == ">")
        t = "<";
      else if (t == ">=")
        t = "<=";
      else if (t == "<")
        t = ">";
      else if (t == "<=")
        t = ">=";
      swap(i, j);
    }
    if (i == j) {
      if (t == "=" || t == ">=" || t == "<=") continue;
      ok = 0;
    } else if (!cal(s[i][j], t))
      ok = 0;
  }
  if (!ok) {
    puts("0");
    return 0;
  }
  for (i = 1; i <= n * 2; i++) {
    int cnt = 0;
    for (j = i + 1; j <= n * 2; j++)
      if (s[i][j] == "=") cnt++, to[i] = j, to[j] = i;
    if (cnt > 1) {
      ok = 0;
      break;
    }
    cnt = 0;
    for (j = 1; j < i; j++)
      if (s[j][i] == "=") cnt++;
    if (cnt > 1) {
      ok = 0;
      break;
    }
  }
  if (!ok) {
    puts("0");
    return 0;
  }
  for (i = 1; i <= 2 * n; i++) {
    for (j = i; j <= 2 * n; j++) {
      if (s[i][j] == ">=" || s[i][j] == ">")
        v[i].push_back(j);
      else if (s[i][j] == "<=" || s[i][j] == "<")
        v[j].push_back(i);
    }
  }
  memset(dp, -1, sizeof(dp));
  long long ans = dfs(1, n * 2, 1);
  cout << ans << "\n";
  return 0;
}
