//KZNS
#include <fstream>
using namespace std;
//
ifstream fin ("arrange.in");
ofstream fout ("arrange.out");
//
int N, M;
unsigned int xz[23] = {0};
long long ck[23][1048587] = {0};
bool ud[23][1048587] = {0};
//
void rin() {
fin >> N >> M;
int a, b;
for (int i = 0; i < M; i++) {
fin >> a >> b;
xz[a] |= (1 << (b-1));
}
}
long long CK(int x, unsigned int zz) {
if (ud[x][zz])
return ck[x][zz];
ud[x][zz] = true;
if (x == N) {
for (int i = 0; i < N; i++)
if (!((zz | xz[x]) & (1 << i)))
ck[x][zz]++;
}
else {
for (int i = 0; i < N; i++)
if (!((zz | xz[x]) & (1 << i)))
ck[x][zz] += CK(x + 1, zz | (1 << i));
}
return ck[x][zz];
}
//
int main() {
rin();
fout << CK(1, 0);
return 0;
}
//UBWH