#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<set>
#include<bitset>
#include<map>
#define fo(i,a,b) for(int i=a;i<=b;i++)
#define fd(i,a,b) for(int i=a;i>=b;i--)
using namespace std;
typedef long long LL;
typedef double db;
int get(){
char ch;
while(ch=getchar(),(ch<'0'||ch>'9')&&ch!='-');
if (ch=='-'){
int s=0;
while(ch=getchar(),ch>='0'&&ch<='9')s=s*10+ch-'0';
return -s;
}
int s=ch-'0';
while(ch=getchar(),ch>='0'&&ch<='9')s=s*10+ch-'0';
return s;
}
const int N = 17;
const int L = 32800;
const int mo = 1e9+7;
LL f[N][L];
int t[L];
int co[N],cu[N];
int n,m;
LL c0[N],c1[N];
LL mi[300];
int cnt[L];
int s1[14350000],s2[14350000];
int it[N],sit[L];
inline LL add(LL x,LL y){
return x+y>=mo?x+y-mo:x+y;
}
inline int trs(int x,int y){
int ct=0;
fo(i,0,n-1){
ct=ct*3;
if ((x&(1<<i))>0)ct=ct+1;
if ((y&(1<<i))>0)ct=ct+2;
}
return ct;
}
int main(){
n=get();m=get();
fo(i,1,m){
int x=get(),y=get();
co[y]|=(1<<(x-1));
cu[x]|=(1<<(y-1));
it[y]++;
}
mi[0]=1;
fo(i,1,m)mi[i]=mi[i-1]*2%mo;
fo(i,1,(1<<n)-1)cnt[i]=cnt[i-(i&-i)]+1;
fo(i,0,(1<<n)-1){
for(int x=i;x<(1<<n);x=((x+1)|i)){
int x_=x^i;
int now=trs(i,x_);
//s1
fo(t,1,n)
if (((1<<(t-1))&i)>0)s1[now]=s1[now]+cnt[cu[t]&x_];
s1[now]=mi[s1[now]];
//s2
s2[now]=1;
fo(t,1,n)
if (((1<<(t-1))&x_)>0)s2[now]=1ll*s2[now]*(mi[cnt[cu[t]&i]]+mo-1)%mo;
}
fo(x,1,n)
if ((i&(1<<(x-1)))>0)sit[i]+=it[x];
}
LL ans=0;
fo(i,1,(1<<n)-1){
f[0][i]=s2[trs(i,((1<<n)-1)^i)];
if ((i&3)==3)ans=add(ans,f[0][i]*mi[m-sit[i]]%mo);
}
fo(i,0,(1<<n)-1)
for(int x=(i+1)|i;x<(1<<n);x=((x+1)|i)){
int x_=i^x;
int t1=trs(i,x_),t2=trs(x_,((1<<n)-1)^x);
fo(lev,0,n-1)
if (f[lev][i]){
LL tmp=f[lev][i]*s1[t1]%mo*s2[t2]%mo;
f[lev+1][x]=add(f[lev+1][x],tmp);
if ((i&3)==0&&(x&3)==3)ans=add(ans,tmp*mi[m-sit[x]]%mo);
}
}
ans=(mi[m]+mo-ans)%mo;
printf("%lld\n",ans);
return 0;
}