#include <bits/stdc++.h>
#define mset(a, b) memset(a, b, sizeof(a))
#define mcpy(a, b) memcpy(a, b, sizeof(a))
#define rg register
using namespace std;
typedef long long LL;
const int N = 15;
const LL MOD = 1e9 + 7;

template <typename T> inline void read(T &AKNOI) {
	T x = 0, flag = 1;
	char ch = getchar();
	while (!isdigit(ch)){
		if (ch == '-') flag = -1;
		ch = getchar();
	}
	while (isdigit(ch)) {
		x = x * 10 + ch - '0';
		ch = getchar();
	}
	AKNOI = flag * x;
}

int n, m, g[N], bit[1<<N];
LL pw[N*N], dp[1<<N];

void init() {
	read(n); read(m);
	pw[0] = 1;
	for (int i = 1, u, v; i <= m; ++i) {
		pw[i] = pw[i-1] * 2 % MOD;
		read(u); read(v);
		--u; --v;
		g[u] |= (1<<v);
	}
}

void solve() {
	int full = (1<<n);
	dp[0] = 1;
	for (int S = 1; S < full; ++S) {
		bit[S] = bit[S>>1] + (S&1);
	}
	for (int S = 0; S < full; ++S) {
		if ((S & 1) ^ ((S>>1) & 1)) continue;
		for (int T = S; T; T = (T-1) & S) {
			if ((T & 1) ^ ((T>>1) & 1)) continue;
			LL tmp = 1;
			for (int i = 0; i < n; ++i) {
				if ((S>>i) & 1) {
					if ((T>>i) & 1) {
						tmp = tmp * pw[bit[ g[i] & (S ^ T) ]] % MOD;
					} else {
						tmp = tmp * (pw[bit[ g[i] & T ]] - 1) % MOD;
					}
				}
			}
			dp[S] = (dp[S] + tmp % MOD * dp[S^T]) % MOD;
		}
	}
	printf("%lld\n", (pw[m] - dp[full-1] + MOD) % MOD);
}

int main() {
	init();
	solve();
	return 0;
}
