#include <bits/stdc++.h>
using namespace std;
#pragma comment(linker, "/STACK:16777216")
const int inf = 0x3f3f3f3f;
const long double pi = acos(-1.0);
const string debug_line = "yolo";
const double PI = 4 * atan(1);
long long dp[81][81];
bool visited[81][81];
vector<pair<int, int> > Adj[81];
int n;
vector<pair<pair<int, int>, string> > edge;
bool check(int l, int r, int l1, int r1, int index1, int index2) {
  for (auto &(t1) : (Adj[index1])) {
    int op = t1.first;
    if (op == 0) {
      if (t1.second != index2 && t1.second != index1) {
        return false;
      }
    } else if (op == 2) {
      if (t1.second <= l1 || t1.second >= r1) {
        return false;
      }
    } else if (op == 1) {
      if (t1.second > l && t1.second < r) {
        return false;
      }
    } else if (op == 3) {
      if (!(t1.second > l && t1.second < r)) {
        return false;
      }
    } else if (op == 4) {
      if (!(t1.second <= l1 || t1.second >= r1)) {
        return false;
      }
    }
  }
  for (auto &(t1) : (Adj[index2])) {
    int op = t1.first;
    if (op == 0) {
      if (t1.second != index1 && t1.second != index2) {
        return false;
      }
    } else if (op == 2) {
      if (t1.second <= l1 || t1.second >= r1) {
        return false;
      }
    } else if (op == 1) {
      if (t1.second > l && t1.second < r) {
        return false;
      }
    } else if (op == 3) {
      if (!(t1.second > l && t1.second < r)) {
        return false;
      }
    } else if (op == 4) {
      if (!(t1.second <= l1 || t1.second >= r1)) {
        return false;
      }
    }
  }
  return true;
}
int main() {
  int k;
  scanf("%d%d", &n, &k);
  for (int(i) = (0); (i) < (k); ++(i)) {
    int a, b;
    string c;
    cin >> a >> c >> b;
    edge.push_back(make_pair(make_pair(a, b), c));
    if (c == "=") {
      Adj[a].push_back(make_pair(0, b));
      Adj[b].push_back(make_pair(0, a));
    } else if (c == ">") {
      Adj[a].push_back(make_pair(1, b));
      Adj[b].push_back(make_pair(2, a));
    } else if (c == "<") {
      Adj[a].push_back(make_pair(2, b));
      Adj[b].push_back(make_pair(1, a));
    } else if (c == "<=") {
      Adj[a].push_back(make_pair(3, b));
      Adj[b].push_back(make_pair(4, a));
    } else if (c == ">=") {
      Adj[a].push_back(make_pair(4, b));
      Adj[b].push_back(make_pair(3, a));
    }
  }
  dp[0][2 * n + 1] = 1LL;
  priority_queue<pair<pair<int, int>, int>, vector<pair<pair<int, int>, int> >,
                 greater<pair<pair<int, int>, int> > >
      Q1;
  Q1.push(make_pair(make_pair(0, 0), 2 * n + 1));
  while (!Q1.empty()) {
    pair<pair<int, int>, int> t1 = Q1.top();
    Q1.pop();
    int l = t1.first.second;
    int r = t1.second;
    int d = t1.first.first;
    visited[l][r] = true;
    int valueNext = (l + 2 * n + 1 - r) / 2;
    if (l + 3 == r) {
      if (check(l, r, l + 1, r - 1, l + 1, r - 1)) {
        dp[l + 1][r - 1] = (dp[l + 1][r - 1] + dp[l][r]);
      } else {
      }
      continue;
    } else {
      if (check(l, r, l + 2, r, l + 1, l + 2)) {
        dp[l + 2][r] = (dp[l + 2][r] + dp[l][r]);
        if (!visited[l + 2][r]) {
          Q1.push(make_pair(make_pair(d + 1, l + 2), r));
          visited[l + 2][r] = true;
        }
      } else {
      }
      if (check(l, r, l + 1, r - 1, l + 1, r - 1)) {
        dp[l + 1][r - 1] = (dp[l + 1][r - 1] + dp[l][r]);
        if (!visited[l + 1][r - 1]) {
          Q1.push(make_pair(make_pair(d + 1, l + 1), r - 1));
          visited[l + 1][r - 1] = true;
        }
      } else {
      }
      if (check(l, r, l, r - 2, r - 1, r - 2)) {
        dp[l][r - 2] = (dp[l][r - 2] + dp[l][r]);
        if (!visited[l][r - 2]) {
          Q1.push(make_pair(make_pair(d + 1, l), r - 2));
          visited[l][r - 2] = true;
        }
      } else {
      }
    }
  }
  long long answer1 = 0;
  for (int(i) = (0); (i) < (2 * n + 1); ++(i)) {
    answer1 = (answer1 + dp[i][i + 1]);
  }
  printf("%lld\n", answer1);
  return 0;
}
