#include <bits/stdc++.h>
using namespace std;
const int INF = int(1e9);
const double EPS = 1e-8;
struct debugger {
  template <typename T>
  debugger& operator,(const T& v) {
    cerr << v << " ";
    return *this;
  }
} dbg;
int cols[5001], rows[5001];
int tcols[5001], trows[5001];
int main() {
  std::ios_base::sync_with_stdio(false);
  int n, m, k;
  scanf("%d%d%d", &n, &m, &k);
  vector<int> xs, ys;
  vector<pair<int, pair<int, int> > > ins;
  for (int it = 0; it < k; it++) {
    int typ, id, col;
    scanf("%d%d%d", &typ, &id, &col);
    id--;
    ins.emplace_back(typ, pair<int, int>(id, col));
    if (typ == 1) {
      xs.push_back(id);
    } else {
      ys.push_back(id);
    }
  }
  sort(xs.begin(), xs.end());
  xs.erase(unique(xs.begin(), xs.end()), xs.end());
  sort(ys.begin(), ys.end());
  ys.erase(unique(ys.begin(), ys.end()), ys.end());
  int nn = (int)xs.size(), mm = (int)ys.size();
  for (int it = 0; it < k; it++) {
    pair<int, pair<int, int> > p = ins[it];
    if (p.first == 1) {
      int id = lower_bound(xs.begin(), xs.end(), p.second.first) - xs.begin();
      rows[id] = p.second.second;
      trows[id] = it;
    } else {
      int id = lower_bound(ys.begin(), ys.end(), p.second.first) - ys.begin();
      cols[id] = p.second.second;
      tcols[id] = it;
    }
  }
  vector<int> revx(n, -1), revy(m, -1);
  for (int id = 0; id < nn; id++) {
    revx[xs[id]] = id;
  }
  for (int id = 0; id < mm; id++) {
    revy[ys[id]] = id;
  }
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
      int c = 0;
      int x = revx[i], y = revy[j];
      if (x != -1 && y != -1) {
        if (trows[x] > tcols[y])
          c = rows[x];
        else
          c = cols[y];
      } else if (x != -1) {
        c = rows[x];
      } else if (y != -1) {
        c = cols[y];
      }
      cout << c << " ";
    }
    cout << "\n";
  }
  return 0;
}
