#include <bits/stdc++.h>
using namespace std;
const long long maxn = 300 + 5;
const long long MOD = 1e9 + 7;
const long long MAXX = 4e18;
long long k, z, n, m, l, s, x, y, ans, a[maxn], b[maxn], dp[maxn][maxn];
vector<pair<string, int> > v[maxn];
string tp;
bool smlcheck(int x, string tp, int y) {
  if (tp == ">")
    return x > y;
  else if (tp == "<")
    return x < y;
  else if (tp == "=")
    return x == y;
  else if (tp == ">=")
    return x >= y;
  else
    return x <= y;
}
bool check(int now) {
  for (auto u : v[now]) {
    if (a[u.second] == -1)
      continue;
    else if (a[u.second] == 0 && !smlcheck(1, u.first, 1))
      return 0;
    else if (a[u.second] == 1 && !smlcheck(1, u.first, 2))
      return 0;
  }
  return 1;
}
long long get(int l, int r) {
  if (l == 0 && r == n - 1) return 1;
  if (dp[l][r] != -1) return dp[l][r];
  long long ans = 0;
  if (l >= 2) {
    for (int i = 0; i < n; i++) {
      if (i == l - 2 || i == l - 1)
        a[i] = 0;
      else if (i < l || i > r)
        a[i] = -1;
      else
        a[i] = 1;
    }
    if (check(l - 1) && check(l - 2)) ans += get(l - 2, r);
  }
  if (r <= n - 3) {
    for (int i = 0; i < n; i++) {
      if (i == r + 1 || i == r + 2)
        a[i] = 0;
      else if (i < l || i > r)
        a[i] = -1;
      else
        a[i] = 1;
    }
    if (check(r + 1) && check(r + 2)) ans += get(l, r + 2);
  }
  if (1 <= l && r <= n - 2) {
    for (int i = 0; i < n; i++) {
      if (i == l - 1 || i == r + 1)
        a[i] = 0;
      else if (i < l || i > r)
        a[i] = -1;
      else
        a[i] = 1;
    }
    if (check(l - 1) && check(r + 1)) ans += get(l - 1, r + 1);
  }
  return dp[l][r] = ans;
}
int main() {
  ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  cin >> n >> k, n *= 2;
  for (int i = 0; i < maxn; i++)
    for (int j = 0; j < maxn; j++) dp[i][j] = -1;
  for (int i = 0; i < k; i++) {
    cin >> x >> tp >> y, x--, y--;
    if (tp == ">")
      v[x].push_back({">", y}), v[y].push_back({"<", x});
    else if (tp == "<")
      v[x].push_back({"<", y}), v[y].push_back({">", x});
    else if (tp == "=")
      v[x].push_back({"=", y}), v[y].push_back({"=", x});
    else if (tp == ">=")
      v[x].push_back({">=", y}), v[y].push_back({"<=", x});
    else
      v[y].push_back({">=", x}), v[x].push_back({"<=", y});
  }
  for (int i = 0; i < n - 1; i++) {
    for (int j = 0; j < n; j++) {
      if (j == i || j == i + 1)
        a[j] = 0;
      else
        a[j] = -1;
    }
    if (check(i) && check(i + 1)) ans += get(i, i + 1);
  }
  cout << ans;
  return 0;
}
