#include <bits/stdc++.h>
using namespace std;
long long const N = 35 + 5;
long long n, k, dp[2 * N][2 * N];
map<string, long long> mp;
bool la[2 * N][2 * N], eq[2 * N][2 * N];
long long get(long long l, long long r) {
  long long &ret = dp[l][r];
  if (~ret) return ret;
  ret = 0;
  if (l == r - 2)
    ret = eq[l][r - 1];
  else {
    bool p1 = 1, p2 = 1, p3 = 1, p4 = 1;
    for (long long i = 0; i < l; i++) {
      p1 &= la[l][i];
      p2 &= la[l + 1][i];
      p3 &= la[r - 2][i];
      p4 &= la[r - 1][i];
    }
    for (long long i = r; i < 2 * n; i++) {
      p1 &= la[l][i];
      p2 &= la[l + 1][i];
      p3 &= la[r - 2][i];
      p4 &= la[r - 1][i];
    }
    if (!p1 || !p2 || !p3 || !p4)
      ret = 0;
    else {
      bool t1 = 1, t2 = 1, t3 = 1;
      for (long long i = l + 2; i < r; i++) t1 &= (la[i][l] && la[i][l + 1]);
      for (long long i = l + 1; i < r - 1; i++)
        t2 &= (la[i][l] && la[i][r - 1]);
      for (long long i = l; i < r - 2; i++)
        t3 &= (la[i][r - 1] && la[i][r - 2]);
      if (t1 && eq[l][l + 1]) ret += get(l + 2, r);
      if (t2 && eq[l][r - 1]) ret += get(l + 1, r - 1);
      if (t3 && eq[r - 1][r - 2]) ret += get(l, r - 2);
    }
  }
  return ret;
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  mp["="] = 1, mp[">"] = 2, mp["<"] = 3, mp[">="] = 4, mp["<="] = 5;
  cin >> n >> k;
  for (long long i = 0; i < 2 * n; i++)
    for (long long j = 0; j < 2 * n; j++) la[i][j] = eq[i][j] = 1;
  for (long long i = 0; i < k; i++) {
    long long x, y, e;
    string s;
    cin >> x >> s >> y;
    x--, y--;
    e = mp[s];
    if (e == 1)
      la[x][y] = la[y][x] = 0;
    else if (e == 2)
      eq[x][y] = eq[y][x] = la[y][x] = 0;
    else if (e == 3)
      eq[x][y] = eq[y][x] = la[x][y] = 0;
    else if (e == 4)
      la[y][x] = 0;
    else if (e == 5)
      la[x][y] = 0;
  }
  for (long long i = 0; i <= 2 * n; i++)
    for (long long j = 0; j <= 2 * n; j++) dp[i][j] = -1;
  cout << get(0, 2 * n);
  return 0;
}
