#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int MAXN=1100005,MOD=1000000007;
int n,m,K,a[MAXN],b[MAXN],c[MAXN],tr[25][MAXN][2];
int x[MAXN],y[25][MAXN];
bool f[MAXN];
int dig(int x,int b){return (x>>b)&1;}
inline void Add(int &a,int b){a+=b;(a>=MOD)?a-=MOD:0;}
int main(){
	scanf("%d%d%d",&n,&m,&K);
	n--;
	for(int i=0;i<K;i++)scanf("%d%d%d",&a[i],&b[i],&c[i]),b[i]--;
	for(int k=0;k<(1<<n);k++)
		for(int i=0;i<n;i++){
			if(dig(k,i))tr[i][k][0]=-1;else tr[i][k][0]=k;
			if(dig(k,i))tr[i][k][1]=k;
			else{
				tr[i][k][1]=k^(1<<i);
				for(int j=i+1;j<n;j++)if(dig(k,j)){
					tr[i][k][1]^=1<<j;
					break;
				}
			}
		}
	x[0]=1;
	for(int i=0;i<m;i++){
		memset(y,0,sizeof(y));
		for(int k=0;k<(1<<n);k++)y[0][k]=x[k];
		for(int j=0;j<n;j++)
			for(int k=0;k<(1<<n);k++){
				tr[j][k][0]!=-1?Add(y[j+1][k],y[j][k]):void(0);
				Add(y[j+1][tr[j][k][1]],y[j][k]);
			}
		memset(f,1,sizeof(f));
		for(int j=0;j<K;j++)if(a[j]==i+1){
			for(int k=0;k<(1<<n);k++)(dig(k,b[j])!=c[j])?f[k]=0:0;
		}
		for(int k=0;k<(1<<n);k++)x[k]=f[k]?y[n][k]:0;
	}
	int ans=0;
	for(int k=0;k<(1<<n);k++)Add(ans,x[k]);
	printf("%d\n",ans);
	return 0;
}
