#include <bits/stdc++.h>
using namespace std;
const long long N = 105;
long long n, m;
long long f[N][N];
vector<pair<long long, string> > relation[N];
void init() {
  cin >> n >> m;
  for (long long i = 1; i <= m; i++) {
    long long u, v;
    string op;
    cin >> u >> op >> v;
    relation[u].push_back(make_pair(v, op));
    if (op[0] == '>') {
      op[0] = '<';
    } else if (op[0] == '<') {
      op[0] = '>';
    }
    relation[v].push_back(make_pair(u, op));
  }
}
bool check(long long l, long long r, long long x, long long y) {
  for (long long i = 0; i < (long long)relation[x].size(); i++) {
    long long v = relation[x][i].first;
    string cur = relation[x][i].second;
    if (cur == ">" && (v >= l && v <= r)) {
      return false;
    }
    if (cur == "=" && v != x && v != y) {
      return false;
    }
    if (cur == "<" && (v < l || v > r || v == x || v == y)) {
      return false;
    }
    if (cur == ">=" && (v >= l && v <= r && v != y && v != x)) {
      return false;
    }
    if (cur == "<=" && (v < l || v > r)) {
      return false;
    }
  }
  return true;
}
void work() {
  for (long long i = 1; i <= 2 * n + 2; i++) {
    f[i][i - 1] = 1;
  }
  for (long long l = 2 * n; l >= 1; l--) {
    for (long long r = l + 1; r <= 2 * n; r++) {
      if (check(l, r, l, l + 1) && check(l, r, l + 1, l)) {
        f[l][r] += f[l + 2][r];
      }
      if (r != l + 1) {
        if (check(l, r, l, r) && check(l, r, r, l)) {
          f[l][r] += f[l + 1][r - 1];
        }
        if (check(l, r, r - 1, r) && check(l, r, r, r - 1)) {
          f[l][r] += f[l][r - 2];
        }
      }
    }
  }
  cout << f[1][2 * n] << endl;
}
int main() {
  ios::sync_with_stdio(false);
  init(), work();
  return 0;
}
