#include<bits/stdc++.h>
using namespace std;
const int N=45,mod=1e9+7;	
int n,m,K,p[N][N],f[2][20][1<<20],nxt[1<<20][20];
inline void add(int &x,int y){x+=y;if(x>=mod)x-=mod;}
int main(){
	cin>>n>>m>>K;
	int x,y,z,lim=(1<<n)-1;n--;
	memset(p,-1,sizeof(p));
	for(int i=1;i<=K;i++){
		scanf("%d%d%d",&x,&y,&z);
		p[x][y]=z;
	}
	for(int i=0;i<=lim;i++){
		for(int j=0;j<n;j++){
			if(!(i>>j&1)){
				for(int k=j+1;k<n;k++)
				if(i>>k&1){nxt[i][j]=i^(1<<k)^(1<<j);break;}
				if(!nxt[i][j])nxt[i][j]=i^(1<<j);
			}
		}
	}
	bool t=0;
	f[t^1][n][0]=1;
	for(int i=1;i<=m;i++,t^=1){
		for(int j=0;j<=lim;j++)f[t][0][j]=f[t^1][n][j],f[t^1][n][j]=0;
		for(int j=0;j<n;j++){
			for(int k=0;k<=lim;k++){
				if(!f[t][j][k])continue;
				if(p[i][j+1]!=(k>>j&1^1))add(f[t][j+1][k],f[t][j][k]);
				if(p[i][j+1] && !(k>>j&1))add(f[t][j+1][nxt[k][j]],f[t][j][k]);
				f[t][j][k]=0;
			}
		}
	}
	int ans=0;t^=1;
	for(int i=0;i<=lim;i++)add(ans,f[t][n][i]);
	cout<<ans<<endl;
	return 0;
}