Problem:
Score : 1600 points

Problem Statement

There is a directed graph G with N vertices and M edges.
The vertices are numbered 1 through N, and the edges are numbered 1 through M.
Edge i is directed from x_i to y_i.
Here, x_i < y_i holds.
Also, there are no multiple edges in G.

Consider selecting a subset of the set of the M edges in G, and removing these edges from G to obtain another graph G'.
There are 2^M different possible graphs as G'.

Alice and Bob play against each other in the following game played on G'.
First, place two pieces on vertices 1 and 2, one on each.
Then, starting from Alice, Alice and Bob alternately perform the following operation:

Select an edge i such that there is a piece placed on vertex x_i, and move the piece to vertex y_i (if there are two pieces on vertex x_i, only move one). The two pieces are allowed to be placed on the same vertex.

The player loses when he/she becomes unable to perform the operation.
We assume that both players play optimally.

Among the 2^M different possible graphs as G', how many lead to Alice's victory?
Find the count modulo 10^9+7.

Constraints

2 ≤ N ≤ 15

1 ≤ M ≤ N(N-1)/2

1 ≤ x_i < y_i ≤ N

All (x_i,\ y_i) are distinct.

Input

Input is given from Standard Input in the following format:

N M
x_1 y_1
x_2 y_2
:
x_M y_M

Output

Print the number of G' that lead to Alice's victory, modulo 10^9+7.

Sample Input 1

2 1
1 2

Sample Output 1

1

The figure below shows the two possible graphs as G'.
A graph marked with ○ leads to Alice's victory, and a graph marked with × leads to Bob's victory.

Sample Input 2

3 3
1 2
1 3
2 3

Sample Output 2

6

The figure below shows the eight possible graphs as G'.

Sample Input 3

4 2
1 3
2 4

Sample Output 3

2

Sample Input 4

5 10
2 4
3 4
2 5
2 3
1 2
3 5
1 3
1 5
4 5
1 4

Sample Output 4

816

Solution in C++14 (GCC 5.4.1) (judge verdict: Time Limit Exceeded)

#include <bits/stdc++.h>
using namespace std;

#define forn(i,n) for(int i=0;i<(int)(n);i++)
#define si(c) ((int)(c).size())
#define forsn(i,s,n) for(int i = (int)(s); i<((int)n); i++)
#define dforsn(i,s,n) for(int i = (int)(n)-1; i>=((int)s); i--)
#define all(c) (c).begin(), (c).end()
#define D(a) cerr << #a << "=" << a << endl;
#define pb push_back
#define eb emplace_back
#define mp make_pair

typedef long long int ll;
typedef vector<int> vi;
typedef pair<int,int> pii;

const int MOD = 1e9 + 7;
const int N = 20;

int n, a[N];
vi adj[N];

ll ans = 0;

int cnt[N][N];
void go(int u, int ways) {
    if (u == -1) {
        if (a[0] != a[1]) ans += ways;
        //forn(u,n) cerr << a[u] << ' '; cerr << endl;
        return;
    }

    forn(i,n-u) cnt[u][i] = 0;
    
    int total = 0;
    for (int v : adj[u]) {
        cnt[u][a[v]]++;
        total++;
    }

    int prod = ways;
    forn(mex,n-u) {
        a[u] = mex;
        total -= cnt[u][mex];
        go(u-1,(ll(prod)<<total)%MOD);
        prod = (prod * ((1LL<<cnt[u][mex])-1)) % MOD;
        if (prod == 0) break;
    }

}

int main() {
    ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
     
    if (false) {
        int n = 15;
        vector<pii> e;
        forn(v,n) forn(u,v) e.eb(u,v);
        cout << n << ' ' << si(e) << endl;
        for (auto uv : e) cout << uv.first+1 << ' ' << uv.second+1 << endl;
        return 0;
    }

    int m;
    cin >> n >> m;
    while (m--) {
        int u,v; cin >> u >> v;
        u--; v--;
        adj[u].pb(v);
    }

    go(n-1,1);
    ans %= MOD;
    cout << ans << endl;


    return 0;
}