#include <bits/stdc++.h>
using namespace std;
stack<pair<int, int> > targetPoints;
queue<pair<int, int> > q;
int penalty;
int tx[] = {0, 1};
int ty[] = {1, 0};
bool visited[51][51];
bool validTargetPoint(int x, int y, int maxX, int maxY) {
  if (x > maxX || y > maxY || x < 1 || y < 1) return 0;
  if (visited[x][y]) return 0;
  visited[x][y] = true;
  return 1;
}
void findTargetPoints(int n, int m, int k) {
  penalty = 2;
  targetPoints.push(pair<int, int>(1, 1));
  q.push(pair<int, int>(1, 1));
  visited[1][1] = true;
  k--;
  if (k) {
    while (!q.empty()) {
      struct pair<int, int> xyPair = q.front();
      q.pop();
      for (int p = 0; p < 2; p++) {
        if (validTargetPoint(xyPair.first + tx[p], xyPair.second + ty[p], n,
                             m)) {
          targetPoints.push(
              pair<int, int>(xyPair.first + tx[p], xyPair.second + ty[p]));
          q.push(pair<int, int>(xyPair.first + tx[p], xyPair.second + ty[p]));
          k--;
          penalty += xyPair.first + tx[p] + xyPair.second + ty[p];
          if (k == 0) break;
        }
      }
      if (k == 0) break;
    }
  }
  penalty -= targetPoints.size();
}
void printPathFor(pair<int, int> coordinate) {
  int targetX = coordinate.first;
  int targetY = coordinate.second;
  int i = 1, j = 1;
  for (i = 1; i < targetX; i++) {
    printf("(%d,%d) ", i, 1);
  }
  if (targetY != 1)
    printf("(%d,%d) ", i, 1);
  else
    printf("(%d,%d)\n", i, 1);
  for (j = 2; j < targetY; j++) {
    printf("(%d,%d) ", i, j);
  }
  if (targetY != 1) printf("(%d,%d)\n", i, j);
}
int main() {
  int n, m, k;
  scanf("%d%d%d", &n, &m, &k);
  findTargetPoints(n, m, k);
  printf("%d\n", penalty);
  while (!targetPoints.empty()) {
    pair<int, int> targetCoordinate = targetPoints.top();
    printPathFor(targetCoordinate);
    targetPoints.pop();
  }
  return 0;
}
