#include <cstdio>
#define repu(i,x,y) for (int i=x; i<=y; ++i)
#define repd(i,x,y) for (int i=x; i>=y; --i)
using namespace std;

typedef long long LL;
const int p=1000000007;
int n,m,f[33000],cnt[20][33000];
bool map[20][20];

int power(int x,int k)
{
    int ret=1;
    for (; k; k>>=1,x=LL(x)*x%p)
        if (k&1)
            ret=LL(ret)*x%p;
    return ret;
}

int main()
{
    scanf("%d%d",&n,&m);
    repu(i,1,m)
    {
        int u,v;
        scanf("%d%d",&u,&v),map[u-1][v-1]=1;
    }
    repu(i,0,n-1)
        repu(j,0,(1<<n)-1)
        {
            cnt[i][j]=1;
            repu(k,0,n-1)
                if ((j&(1<<k)) && map[i][k])
                    (cnt[i][j]*=2)%=p;
            --cnt[i][j];
            repu(k,0,n-1)
                if ((j&(1<<k)) && map[k][i])
                    (cnt[i][j]*=2)%=p;
        }
    f[0]=1;
    repu(i,0,(1<<n)-1)
        if (f[i])
        {
            int s=(1<<n)-1-i;
            for (int j=s; j; j=(j-1)&s)
                if ((j&1)==((j>>1)&1))
                {
                    int w=f[i];
                    repu(k,0,n-1)
                        if ((i>>k)&1)
                            w=LL(w)*cnt[k][j]%p;
                    (f[i^j]+=w)%=p;
                }
        }
    printf("%d\n",(power(2,m)-f[(1<<n)-1]+p)%p);
    return 0;
}