#include <bits/stdc++.h>
using namespace std;
bool v[110][110];
long long f[110][110];
int to[] = {0, 1, 4, 5, 2, 3};
int l[110], r[110], typ[110], n, m;
long long solve(int L, int R) {
  if (v[L][R]) return f[L][R];
  v[L][R] = true;
  if (R == L + 1) return f[L][R] = 1;
  bool ok = true;
  for (int i = 1; i <= m; i++) {
    if (l[i] == L + 1 || l[i] == L + 2) {
      if (typ[i] == 1 && r[i] != L + 1 && r[i] != L + 2) {
        ok = false;
        break;
      }
      if (r[i] >= R && (typ[i] == 4 || typ[i] == 5)) {
        ok = false;
        break;
      }
      if (r[i] > L + 2 && r[i] < R && (typ[i] == 2 || typ[i] == 3)) {
        ok = false;
        break;
      }
      if (l[i] == L + 1 && r[i] == L + 2 && (typ[i] == 2 || typ[i] == 4)) {
        ok = false;
        break;
      }
    }
    if (r[i] == L + 1 || r[i] == L + 2) {
      if (typ[i] == 1 && l[i] != L + 1 && l[i] != L + 2) {
        ok = false;
        break;
      }
      if (l[i] <= L && (typ[i] == 2 || typ[i] == 3)) {
        ok = false;
        break;
      }
    }
  }
  if (ok) f[L][R] += solve(L + 2, R);
  if (R == L + 3) return f[L][R];
  ok = true;
  for (int i = 1; i <= m; i++) {
    if (l[i] == R - 1 || l[i] == R - 2) {
      if (typ[i] == 1 && r[i] != R - 1 && r[i] != R - 2) {
        ok = false;
        break;
      }
      if (r[i] >= R && (typ[i] == 4 || typ[i] == 5)) {
        ok = false;
        break;
      }
      if (l[i] == R - 2 && r[i] == R - 1 && (typ[i] == 2 || typ[i] == 4)) {
        ok = false;
        break;
      }
    }
    if (r[i] == R - 1 || r[i] == R - 2) {
      if (typ[i] == 1 && l[i] != R - 1 && l[i] != R - 2) {
        ok = false;
        break;
      }
      if (l[i] <= L && (typ[i] == 2 || typ[i] == 3)) {
        ok = false;
        break;
      }
      if (l[i] > L && l[i] < R - 2 && (typ[i] == 4 || typ[i] == 5)) {
        ok = false;
        break;
      }
    }
  }
  if (ok) f[L][R] += solve(L, R - 2);
  ok = true;
  for (int i = 1; i <= m; i++) {
    if (l[i] == L + 1) {
      if (typ[i] == 1 && r[i] != R - 1) {
        ok = false;
        break;
      }
      if (r[i] >= R && (typ[i] == 4 || typ[i] == 5)) {
        ok = false;
        break;
      }
      if (r[i] < R - 1 && (typ[i] == 2 || typ[i] == 3)) {
        ok = false;
        break;
      }
      if (r[i] == R - 1 && (typ[i] == 2 || typ[i] == 4)) {
        ok = false;
        break;
      }
    }
    if (l[i] == R - 1) {
      if (typ[i] == 1 || typ[i] == 4 || typ[i] == 5) {
        ok = false;
        break;
      }
    }
    if (r[i] == L + 1) {
      if (typ[i] == 1 || typ[i] == 2 || typ[i] == 3) {
        ok = false;
        break;
      }
    }
    if (r[i] == R - 1) {
      if (typ[i] == 1 && l[i] != L + 1) {
        ok = false;
        break;
      }
      if (l[i] <= L && (typ[i] == 2 || typ[i] == 3)) {
        ok = false;
        break;
      }
      if (l[i] > L + 1 && (typ[i] == 4 || typ[i] == 5)) {
        ok = false;
        break;
      }
    }
  }
  if (ok) f[L][R] += solve(L + 1, R - 1);
  return f[L][R];
}
int main() {
  scanf("%d%d", &n, &m);
  int i = 0;
  for (int j = 1; j <= m; j++) {
    char s[5];
    i++;
    scanf("%d%s%d", &l[i], s, &r[i]);
    if (l[i] == r[i]) {
      i--;
      continue;
    }
    if (s[0] == '=')
      typ[i] = 1;
    else if (s[0] == '>') {
      if (s[1] == '=')
        typ[i] = 3;
      else
        typ[i] = 2;
    } else {
      if (s[1] == '=')
        typ[i] = 5;
      else
        typ[i] = 4;
    }
    if (l[i] > r[i]) {
      swap(l[i], r[i]);
      typ[i] = to[typ[i]];
    }
  }
  m = i;
  cout << solve(0, 2 * n + 1) << endl;
  return 0;
}
