#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <memory.h>
#include <vector>

using namespace std;
typedef long long LL;

const int maxn = 20;
const int maxm = 1<<19;
const int mod = 1e9+7;

int dp[2][maxm],op;
int nex[maxn][maxm];
int lim[maxn][maxn];
int n,m,K,S;

void inc(int &x,int y) {
	x+=y;x>=mod?x-=mod:0;
}
int main()
{
	#ifdef Amberframe
		freopen("agc017f.in","r",stdin);
		freopen("agc017f.out","w",stdout);
	#endif
	scanf("%d %d %d",&n,&m,&K);S=1<<n-1; 
	for (int i=0;i<n-1;i++)
	for (int j=0;j<S;j++)
	if (j>>i&1) nex[i][j]=j^(1<<i);
	else {
		nex[i][j]=j^(1<<i);
		int k=i+1;while (k<n-1&&!(j>>k&1)) ++k;
		if (k<n-1) nex[i][j]^=1<<k;
	}
	
	for (int i=0;i<m;i++)
	for (int j=0;j<n-1;j++) lim[i][j]=-1;
	for (int a,b,c,i=1;i<=K;i++)
		scanf("%d %d %d",&a,&b,&c),lim[a-1][b-1]=c;
		
	for (int j=0;j<S;j++)
	{
		bool tag=true;
		for (int k=0;k<n-1;k++)
		if (j>>k&1) {
			if (lim[0][k]==0) tag=false;
		}
		else {
			if (lim[0][k]==1) tag=false;
		}
		if (tag) dp[0][j]=1;
	}
	for (int i=1;i<m;i++)
	for (int k=0;k<n-1;k++) {
		op^=1;
		for (int j=0;j<S;j++)
		if (int w=dp[op^1][j]) {
			dp[op^1][j]=0;
			if (j>>k&1) {
				if (lim[i][k]!=0)
					inc(dp[op][j],w);
			}
			else {
				if (lim[i][k]!=1)
					inc(dp[op][j],w);
				if (lim[i][k]!=0)
					inc(dp[op][nex[k][j]],w);
			}
		}
	}
	int ans=0;
	for (int j=0;j<S;j++)
		inc(ans,dp[op][j]);
	printf("%d",ans);
	return 0;
}