#include <bits/stdc++.h>
using namespace std;
#define int long long
#define lb double long
#define el '\n'
#define pb push_back
#define all(x) begin(x), end(x)
#define sz(s) (s.size())
#define oo LLONG_MAX
#define pp pair<int, int>
void setIO(string s) {
#ifndef ONLINE_JUDGE
freopen((s + ".in").c_str(), "r", stdin);
freopen((s + ".out").c_str(), "w", stdout);
#endif
}
const int MOD = (int) 1e9+7; //998244353;
const int MAX = 1e5 + 5;
int n, r;
vector<tuple<int,int,int>> a;
void Solve(){
cin >> n >> r;
for (int i = 1, type; i <= r; i++) {
char x, y;
cin >> type >> x >> y;
a.pb({type, x, y});
}
string s = "";
for (int i = 'A'; i <= 'J'; i++) {
if (sz(s) == n) break;
s += (char)i;
}
int res = 0;
sort(all(s));
do {
bool ok = 1;
int pos[256];
for (int i = 0; i < n; i++) pos[s[i]] = i;
for (auto &[type, x, y] : a) {
if (type == 1 && pos[x] >= pos[y]) { ok = 0; break; }
if (type == 2 && pos[x] <= pos[y]) { ok = 0; break; }
if (type == 3 && abs(pos[x] - pos[y]) == 1) { ok = 0; break; }
}
res += ok;
} while (next_permutation(all(s)));
cout << res << el;
}
signed main (){
ios_base::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
int T(1);
// cin >> T;
while(T--) Solve();
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiNkZWZpbmUgaW50IGxvbmcgbG9uZwojZGVmaW5lIGxiIGRvdWJsZSBsb25nCiNkZWZpbmUgZWwgJ1xuJwojZGVmaW5lIHBiIHB1c2hfYmFjawojZGVmaW5lIGFsbCh4KSBiZWdpbih4KSwgZW5kKHgpCiNkZWZpbmUgc3oocykgKHMuc2l6ZSgpKQojZGVmaW5lIG9vIExMT05HX01BWAojZGVmaW5lIHBwIHBhaXI8aW50LCBpbnQ+CiAKdm9pZCBzZXRJTyhzdHJpbmcgcykgewogICAgI2lmbmRlZiBPTkxJTkVfSlVER0UKICAgICAgICBmcmVvcGVuKChzICsgIi5pbiIpLmNfc3RyKCksICJyIiwgc3RkaW4pOwogICAgICAgIGZyZW9wZW4oKHMgKyAiLm91dCIpLmNfc3RyKCksICJ3Iiwgc3Rkb3V0KTsKICAgICNlbmRpZgp9CiAKY29uc3QgaW50IE1PRCA9IChpbnQpIDFlOSs3OyAvLzk5ODI0NDM1MzsKY29uc3QgaW50IE1BWCA9IDFlNSArIDU7CiAKaW50IG4sIHI7CnZlY3Rvcjx0dXBsZTxpbnQsaW50LGludD4+IGE7CiAKdm9pZCBTb2x2ZSgpewpjaW4gPj4gbiA+PiByOwpmb3IgKGludCBpID0gMSwgdHlwZTsgaSA8PSByOyBpKyspIHsKICAgY2hhciB4LCB5OwogICBjaW4gPj4gdHlwZSA+PiB4ID4+IHk7CiAgIGEucGIoe3R5cGUsIHgsIHl9KTsKfQogCnN0cmluZyBzID0gIiI7CmZvciAoaW50IGkgPSAnQSc7IGkgPD0gJ0onOyBpKyspIHsKICAgaWYgKHN6KHMpID09IG4pIGJyZWFrOwogICBzICs9IChjaGFyKWk7Cn0KIAppbnQgcmVzID0gMDsKc29ydChhbGwocykpOwpkbyB7CiAgIGJvb2wgb2sgPSAxOwogICBpbnQgcG9zWzI1Nl07CiAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSBwb3Nbc1tpXV0gPSBpOwogICBmb3IgKGF1dG8gJlt0eXBlLCB4LCB5XSA6IGEpIHsKICAgICAgIGlmICh0eXBlID09IDEgJiYgcG9zW3hdID49IHBvc1t5XSkgeyBvayA9IDA7IGJyZWFrOyB9CiAgICAgICBpZiAodHlwZSA9PSAyICYmIHBvc1t4XSA8PSBwb3NbeV0pIHsgb2sgPSAwOyBicmVhazsgfQogICAgICAgaWYgKHR5cGUgPT0gMyAmJiBhYnMocG9zW3hdIC0gcG9zW3ldKSA9PSAxKSB7IG9rID0gMDsgYnJlYWs7IH0KICAgfQogICByZXMgKz0gb2s7Cn0gd2hpbGUgKG5leHRfcGVybXV0YXRpb24oYWxsKHMpKSk7CiAKY291dCA8PCByZXMgPDwgZWw7Cn0KIApzaWduZWQgbWFpbiAoKXsKICAgIGlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOwogICAgY2luLnRpZSgwKSwgY291dC50aWUoMCk7CiAKICAgIGludCBUKDEpOwogICAgLy8gY2luID4+IFQ7CiAgICB3aGlsZShULS0pIFNvbHZlKCk7CiAKICAgIHJldHVybiAwOwp9