#include <bits/stdc++.h>
using namespace std;
long long mInv[41];
long long fact[41];
long long factInv[41];
map<long, long> mymap;
long long heights[5];
long long segTree[3];
long nums[5005];
long g[5005];
vector<long> primes;
vector<long> badPrimes;
long funcVal[1000006];
long long N;
set<string> dictionary;
set<string>::iterator it;
pair<set<string>::iterator, bool> ret;
long long gcd(long long a, long long b) {
  if (b == 0) return a;
  if (a % b == 0) return b;
  return gcd(b, a % b);
}
long long getmoduloInv(long long n) {
  if (n == 1) return 1;
  if (mInv[n] > 0) return mInv[n];
  long long m = (-1 * 1000000007) / n;
  m += 1000000007;
  m *= getmoduloInv(1000000007 % n);
  mInv[n] = (m % 1000000007);
  return mInv[n];
}
vector<long> get_primes(unsigned long maxN) {
  char *sieve;
  sieve = new char[maxN / 8 + 1];
  long m = (maxN / 8) + 1;
  for (long long i = 0; i < m; i++) sieve[i] = 255;
  for (unsigned long x = 2; x <= maxN; x++)
    if (sieve[x / 8] & (0x01 << (x % 8))) {
      primes.push_back(x);
      for (unsigned long j = 2 * x; j <= maxN; j += x)
        sieve[j / 8] &= ~(0x01 << (j % 8));
    }
  delete[] sieve;
  return primes;
}
long long getPow(long long b, long long p) {
  if (b < 2 || p == 1) return b;
  if (p == 0) return 1;
  long long val = getPow(b, p / 2);
  val *= val;
  val %= 1000000007;
  if (p % 2 == 1) {
    val *= b;
    val %= 1000000007;
  }
  return val;
}
void buildSegTree(long node, long b, long e) {
  if (b == e)
    segTree[node] = b;
  else {
    long mid = (b + e) / 2;
    buildSegTree(node * 2, b, mid);
    buildSegTree(1 + node * 2, mid + 1, e);
    if (heights[segTree[node * 2]] <= heights[segTree[1 + node * 2]])
      segTree[node] = segTree[node * 2];
    else
      segTree[node] = segTree[1 + node * 2];
  }
}
long long getMin(long node, long segBeg, long segEnd, long qBeg, long qEnd) {
  if (segEnd < qBeg || segBeg > qEnd) return N + 1;
  if (segBeg >= qBeg && segEnd <= qEnd) return segTree[node];
  long mid = (segBeg + segEnd) / 2;
  long fh = getMin(node * 2, segBeg, mid, qBeg, qEnd);
  long sh = getMin(1 + node * 2, mid + 1, segEnd, qBeg, qEnd);
  if (heights[sh] < heights[fh]) return sh;
  return fh;
}
string genMinString(long long val) {
  long len = val / 9, firstDigit = val % 9;
  string s = "";
  if (firstDigit > 0) {
    char ch = '0' + firstDigit;
    s = ch + s;
  }
  for (long i = 0; i < len; i++) s = s + "9";
  return s;
}
long maxBuild;
vector<long> mult(vector<long> A, vector<long> B) {
  long len1 = A.size(), len2 = B.size();
  vector<long> C;
  for (long i = 0; i < len1; i++) {
    long carry = 0;
    for (long j = 0; j < len2; j++) {
      long pos = i + j;
      long val = carry + (A[i] * B[j]);
      carry = val / 10;
      val = val % 10;
      if (pos >= C.size()) {
        C.push_back(val);
      } else {
        C[pos] += val;
        carry = C[pos] / 10;
        C[pos] = C[pos] % 10;
      }
    }
    if (carry > 0) C.push_back(carry);
  }
  return C;
}
vector<long> getVal(long power) {
  vector<long> C;
  C.push_back(5);
  if (power == 1) return C;
  vector<long> B = getVal(power / 2);
  B = mult(B, B);
  if (power % 2 == 1) B = mult(B, C);
  return B;
}
long getZeros(long fives) {
  long ans = 0;
  while (fives > 0) {
    ans += fives;
    fives /= 5;
  }
  return ans;
}
long long getPow(long zeros) {
  long val = ((zeros * 4) / 5) - 1;
  while (getZeros(val) < zeros) val++;
  if (getZeros(val) == zeros) return val;
  return -1;
}
long long rowVal[5050], colVal[5050];
long long rowAlter[5050], colAlter[5050];
int main(void) {
  long long test_cases = 1, l, r, seed = 1, maxVal;
  vector<string> originalStrings;
  long long curNum;
  long long m, n, k;
  long long ans = 0;
  for (long T = 0; T < test_cases; T++) {
    cin >> n >> m >> k;
    long rv, cv, av;
    memset(rowVal, 0, sizeof(rowVal));
    memset(colVal, 0, sizeof(colVal));
    memset(rowAlter, -1, sizeof(rowAlter));
    memset(colAlter, -1, sizeof(colAlter));
    for (long i = 0; i < k; i++) {
      scanf("%ld", &av);
      scanf("%ld", &rv);
      rv--;
      scanf("%ld", &cv);
      if (av == 1) {
        rowVal[rv] = cv;
        rowAlter[rv] = i;
      } else {
        colVal[rv] = cv;
        colAlter[rv] = i;
      }
    }
    for (long i = 0; i < n; i++) {
      for (long j = 0; j < m; j++) {
        if (rowAlter[i] > colAlter[j])
          printf("%ld ", rowVal[i]);
        else
          printf("%ld ", colVal[j]);
      }
      cout << endl;
    }
  }
  return 0;
}
