#include <bits/stdc++.h>
using namespace std;
struct relation {
  long long x, type;
};
long long n, k;
long long dp[100][100];
vector<relation> rel[100];
void read() {
  long long i, sz;
  long long x, y;
  relation el;
  char s[5];
  scanf("%lld%lld", &n, &k);
  for (i = 1; i <= k; i++) {
    scanf("%lld%s%lld", &x, s, &y);
    sz = strlen(s);
    el.x = y;
    if (s[0] == '=')
      el.type = 1;
    else if (s[0] == '<' && sz == 1)
      el.type = 2;
    else if (s[0] == '>' && sz == 1)
      el.type = 3;
    else if (s[0] == '<' && sz == 2)
      el.type = 4;
    else if (s[0] == '>' && sz == 2)
      el.type = 5;
    rel[x].push_back(el);
    el.x = x;
    if (el.type == 2)
      el.type = 3;
    else if (el.type == 3)
      el.type = 2;
    else if (el.type == 4)
      el.type = 5;
    else if (el.type == 5)
      el.type = 4;
    rel[y].push_back(el);
  }
}
bool isCompatible(long long p1, long long p2, long long x, long long y) {
  long long i, sz;
  sz = rel[p1].size();
  for (i = 0; i < sz; i++) {
    if (rel[p1][i].x == p1) {
      if (rel[p1][i].type == 1 || rel[p1][i].type == 4 || rel[p1][i].type == 5)
        continue;
      return false;
    }
    if (rel[p1][i].type == 1 && rel[p1][i].x != p2) return false;
    if (rel[p1][i].type == 2 &&
        ((rel[p1][i].x < x || rel[p1][i].x > y) || rel[p1][i].x == p2))
      return false;
    if (rel[p1][i].type == 3 &&
        ((rel[p1][i].x >= x && rel[p1][i].x <= y) || rel[p1][i].x == p2))
      return false;
    if (rel[p1][i].type == 4 && (rel[p1][i].x < x || rel[p1][i].x > y) &&
        rel[p1][i].x != p2)
      return false;
    if (rel[p1][i].type == 5 && rel[p1][i].x >= x && rel[p1][i].x <= y &&
        rel[p1][i].x != p2)
      return false;
  }
  sz = rel[p2].size();
  for (i = 0; i < sz; i++) {
    if (rel[p2][i].x == p2) {
      if (rel[p2][i].type == 1 || rel[p2][i].type == 4 || rel[p2][i].type == 5)
        continue;
      return false;
    }
    if (rel[p2][i].type == 1 && rel[p2][i].x != p1) return false;
    if (rel[p2][i].type == 2 &&
        ((rel[p2][i].x < x || rel[p2][i].x > y) || rel[p2][i].x == p1))
      return false;
    if (rel[p2][i].type == 3 &&
        ((rel[p2][i].x >= x && rel[p2][i].x <= y) || rel[p2][i].x == p1))
      return false;
    if (rel[p2][i].type == 4 && (rel[p2][i].x < x || rel[p2][i].x > y) &&
        rel[p2][i].x != p1)
      return false;
    if (rel[p2][i].type == 5 && rel[p2][i].x >= x && rel[p2][i].x <= y &&
        rel[p2][i].x != p1)
      return false;
  }
  return true;
}
bool shit(long long x, long long y) {
  long long i, sz;
  sz = rel[x].size();
  for (i = 0; i < sz; i++)
    if (rel[x][i].type != 1 && rel[x][i].type != 4 && rel[x][i].type != 5 &&
        rel[x][i].x == y)
      return false;
  return true;
}
long long solve(long long x, long long y) {
  if (y - x == 1 && shit(x, y)) return 1LL;
  if (dp[x][y] >= 0) return dp[x][y];
  dp[x][y] = 0;
  if (isCompatible(x, x + 1, x + 2, y)) dp[x][y] += solve(x + 2, y);
  if (isCompatible(x, y, x + 1, y - 1)) dp[x][y] += solve(x + 1, y - 1);
  if (isCompatible(y - 1, y, x, y - 2)) dp[x][y] += solve(x, y - 2);
  return dp[x][y];
}
int main() {
  long long i, j;
  long long answer;
  read();
  for (i = 1; i < 2 * n; i++)
    for (j = i + 1; j <= 2 * n; j++) dp[i][j] = -1;
  answer = solve(1, 2 * n);
  printf("%lld\n", answer);
}
