#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <vector>
#include <cstring>
#include <queue>
#include <set>
#include <map>
#include <functional>
#include <cmath>
#include <string>
#define SIZE 25
#define BT (1<<21)
#define MOD 1000000007

using namespace std;
typedef long long int ll;
typedef pair <int,int> P;

ll dp[BT];
ll nxt[BT];
int id[SIZE][SIZE];
int n,m,K;

void solve()
{
	for(int S=0;S<1<<n;S++) nxt[S]=dp[S];
	for(int i=0;i<n;i++)
	{
		for(int S=0;S<1<<n;S++)
		{
			if(!(S>>i&1))
			{
				int to=i+1;
				while(to<n&&!(S>>to&1)) to++;
				if(to<n)
				{
					nxt[S+(1<<i)-(1<<to)]+=nxt[S];
				}
				else
				{
					nxt[S+(1<<i)]+=nxt[S];
				}
			}
		}
		for(int S=0;S<1<<n;S++) nxt[S]%=MOD;
	}
}
int main()
{
	scanf("%d %d %d",&n,&m,&K);n--;
	memset(id,-1,sizeof(id));
	for(int i=0;i<K;i++)
	{
		int a,b,c;
		scanf("%d %d %d",&a,&b,&c);a--,b--;
		id[a][b]=c;
	}
	memset(dp,0,sizeof(dp));
	dp[0]=1;
	for(int i=0;i<m;i++)
	{
		solve();
		for(int S=0;S<1<<n;S++)
		{
			bool up=true;
			for(int j=0;j<n;j++)
			{
				if(id[i][j]==0&&(S>>j&1)) up=false;
				else if(id[i][j]==1&&!(S>>j&1)) up=false;
			}
			if(!up) dp[S]=0;
			else dp[S]=nxt[S];
		}
	}
	ll ret=0;
	for(int S=0;S<1<<n;S++)
	{
		ret+=dp[S];
		if(ret>=MOD) ret-=MOD;
	}
	printf("%lld\n",ret);
	return 0;
}
