//  #牛客春招刷题训练营# https://www.nowcoder.com/discuss/726480854079250432
//  图片见底部,图中圈圈表示放一个,叉叉是剩下的
#include <iostream>
#include <vector>
using namespace std;
/*bb_makevec*/template <typename T> T bb_makevec(T bbv_value) {  return bbv_value;}template<typename T1, typename T2, typename ...Args> auto bb_makevec(T1 n, T2 m,
    Args... arg) {  using newtype = decltype(bb_makevec(m, arg...));  return vector<newtype>(n, bb_makevec(m, arg...));}
/*read*/template<typename T> void read(T& bbv_value) {  bbv_value = 0;  char bbv_c;  bbv_c = getchar();  while (bbv_c > '9' || bbv_c < '0') {    bbv_c = getchar();  }  while (bbv_c <= '9' && bbv_c >= '0') {    bbv_value = (bbv_value << 3) + (bbv_value << 1) + (bbv_c & 15);    bbv_c = getchar();  }}
#define rd read
#define pre(i, j, k) for (int i = j; i < k; i++)
int main() {
  int n, m;
  rd(n), rd(m);//--------快读
  auto a = bb_makevec(n, m, 0);//-----创建n * m 的初始元素为0的向量(vector)
  int k;
  rd(k);
  int mmin = min(n, m);
  pre(i, 0, mmin) {//--------对角线放置
    a[i][i] = 1;
    k--;
    if (k < 0) {//---------判断是否足够,注意不是<=而是<,因为当n==m时最后一次可以为零,n!=m时后面另外判断
      cout << -1;
      return 0;
    }
  }
  if (n > m) {
    pre(i, mmin, n - 1) {
      a[i][m - 1] = 1;
      k--;
      if (k <= 0) {
        cout << -1;
        return 0;
      }
    }
  } else {
    pre(i, mmin, m - 1) {
      a[n - 1][i] = 1;
      k--;
      if (k <= 0) {
        cout << -1;
        return 0;
      }
    }
  }
  if (n != m){
    if (k == 0){
      cout << -1;
      return 0;
    }
    a[n- 1][m-1] = k;
  }
  else{
    a[n - 1][m - 1] += k;
  }
  pre(i, 0, n){
    pre(j, 0, m)
      cout << a[i][j] << ' ';
    cout << endl; 
  }
}
// 64 位输出请用 printf("%lld")