#include <bits/stdc++.h>
using namespace std;
long long int dp[100][100];
vector<int> eq[205];
vector<int> geq[205];
vector<int> leq[205];
vector<int> le[205];
vector<int> ge[205];
int n, k;
long long int rob(int a, int b, int zost) {
  if (dp[a][b] != -1) return dp[a][b];
  if (zost == 0) return 1;
  long long int loc = 0;
  if (b < 2 * n - 2) {
    int x1 = b + 1, x2 = b + 2;
    bool ok = true;
    for (__typeof((eq[x1]).begin()) j = ((eq[x1]).begin()); j != (eq[x1]).end();
         ++j)
      if (*j != x1 && *j != x2) ok = false;
    for (__typeof((eq[x2]).begin()) j = ((eq[x2]).begin()); j != (eq[x2]).end();
         ++j)
      if (*j != x1 && *j != x2) ok = false;
    for (__typeof((geq[x1]).begin()) j = ((geq[x1]).begin());
         j != (geq[x1]).end(); ++j)
      if (*j >= a && *j <= b) ok = false;
    for (__typeof((geq[x2]).begin()) j = ((geq[x2]).begin());
         j != (geq[x2]).end(); ++j)
      if (*j >= a && *j <= b) ok = false;
    for (__typeof((ge[x1]).begin()) j = ((ge[x1]).begin()); j != (ge[x1]).end();
         ++j)
      if (*j >= a && *j <= b + 2) ok = false;
    for (__typeof((ge[x2]).begin()) j = ((ge[x2]).begin()); j != (ge[x2]).end();
         ++j)
      if (*j >= a && *j <= b + 2) ok = false;
    if (ok) loc += rob(a, b + 2, zost - 1);
  }
  if (a > 1) {
    int x1 = a - 1, x2 = a - 2;
    bool ok = true;
    for (__typeof((eq[x1]).begin()) j = ((eq[x1]).begin()); j != (eq[x1]).end();
         ++j)
      if (*j != x1 && *j != x2) ok = false;
    for (__typeof((eq[x2]).begin()) j = ((eq[x2]).begin()); j != (eq[x2]).end();
         ++j)
      if (*j != x1 && *j != x2) ok = false;
    for (__typeof((geq[x1]).begin()) j = ((geq[x1]).begin());
         j != (geq[x1]).end(); ++j)
      if (*j >= a && *j <= b) ok = false;
    for (__typeof((geq[x2]).begin()) j = ((geq[x2]).begin());
         j != (geq[x2]).end(); ++j)
      if (*j >= a && *j <= b) ok = false;
    for (__typeof((ge[x1]).begin()) j = ((ge[x1]).begin()); j != (ge[x1]).end();
         ++j)
      if (*j >= a - 2 && *j <= b) ok = false;
    for (__typeof((ge[x2]).begin()) j = ((ge[x2]).begin()); j != (ge[x2]).end();
         ++j)
      if (*j >= a - 2 && *j <= b) ok = false;
    if (ok) loc += rob(a - 2, b, zost - 1);
  }
  if (a > 0 && b < 2 * n - 1) {
    int x1 = a - 1, x2 = b + 1;
    bool ok = true;
    for (__typeof((eq[x1]).begin()) j = ((eq[x1]).begin()); j != (eq[x1]).end();
         ++j)
      if (*j != x1 && *j != x2) ok = false;
    for (__typeof((eq[x2]).begin()) j = ((eq[x2]).begin()); j != (eq[x2]).end();
         ++j)
      if (*j != x1 && *j != x2) ok = false;
    for (__typeof((geq[x1]).begin()) j = ((geq[x1]).begin());
         j != (geq[x1]).end(); ++j)
      if (*j >= a && *j <= b) ok = false;
    for (__typeof((geq[x2]).begin()) j = ((geq[x2]).begin());
         j != (geq[x2]).end(); ++j)
      if (*j >= a && *j <= b) ok = false;
    for (__typeof((ge[x1]).begin()) j = ((ge[x1]).begin()); j != (ge[x1]).end();
         ++j)
      if (*j >= a - 1 && *j <= b + 1) ok = false;
    for (__typeof((ge[x2]).begin()) j = ((ge[x2]).begin()); j != (ge[x2]).end();
         ++j)
      if (*j >= a - 1 && *j <= b + 1) ok = false;
    if (ok) loc += rob(a - 1, b + 1, zost - 1);
  }
  dp[a][b] = loc;
  return loc;
}
int main() {
  scanf("%d%d", &(n), &(k));
  ;
  for (int i = (0); i < (k); ++i) {
    int(a);
    scanf("%d", &(a));
    ;
    char C1, C2, C3;
    C1 = getchar();
    C2 = getchar();
    C3 = getchar();
    int(b);
    scanf("%d", &(b));
    ;
    a--;
    b--;
    if (C2 == '=') {
      eq[a].push_back(b);
      eq[b].push_back(a);
    } else if (C2 == '>' && C3 == ' ') {
      ge[a].push_back(b);
      le[b].push_back(a);
    } else if (C2 == '<' && C3 == ' ') {
      ge[b].push_back(a);
      le[a].push_back(b);
    } else if (C2 == '>') {
      geq[a].push_back(b);
      leq[b].push_back(a);
    } else {
      leq[a].push_back(b);
      geq[b].push_back(a);
    }
  }
  long long int ans = 0;
  for (int s = (0); s < (2 * n - 1); ++s) {
    for (int i = (0); i < (100); ++i)
      for (int j = (0); j < (100); ++j) dp[i][j] = -1;
    bool ok = true;
    if (le[s].size() != 0) ok = false;
    if (le[s + 1].size() != 0) ok = false;
    for (__typeof((eq[s]).begin()) j = ((eq[s]).begin()); j != (eq[s]).end();
         ++j)
      if (s != *j && s + 1 != *j) ok = false;
    for (__typeof((leq[s]).begin()) j = ((leq[s]).begin()); j != (leq[s]).end();
         ++j)
      if (s != *j && s + 1 != *j) ok = false;
    for (__typeof((eq[s + 1]).begin()) j = ((eq[s + 1]).begin());
         j != (eq[s + 1]).end(); ++j)
      if (s != *j && s + 1 != *j) ok = false;
    for (__typeof((leq[s + 1]).begin()) j = ((leq[s + 1]).begin());
         j != (leq[s + 1]).end(); ++j)
      if (s != *j && s + 1 != *j) ok = false;
    if (!ok) continue;
    ans += rob(s, s + 1, n - 1);
  }
  printf("%I64d\n", ans);
}
