// author: Kaidul
#include <bits/stdc++.h>
using namespace std;
#define rep(i, n) for(__typeof(n) i = 0; i < (n); i++)
#define rrep(i, n) for(__typeof(n) i = (n) - 1; i >= 0; --i)
#define rep1(i, n) for(__typeof(n) i = 1; i <= (n); i++)
#define FOR(i, a, b) for(__typeof(b) i = (a); i <= (b); i++)
#define forstl(i, s) for (__typeof ((s).end ()) i = (s).begin (); i != (s).end (); ++i)
#define INF (1 << 30)
#define PI acos(-1.0)
#define pb push_back
#define ppb pop_back
#define all(x) x.begin(), x.end()
#define mem(x, y) memset(x, y, sizeof(x))
#define mem0(x) memset(x, 0, sizeof(x))
#define EPS 1e-9
#define PII pair<int, int>
#define couple make_pair
#define X first
#define Y second
#define VI vector<int>
#define VPII vector< pii >
#define SI set<int>
#define SDi(x) sf("%d", &x)
#define SD2(x, y) sf("%d %d", &x, &y)
#define SD3(x, y, z) sf("%d %d %d", &x, &y, &z)
#define SDs(x) sf("%s", x)
#define pf printf
#define print(x) pf("%d ", x)
#define println(x) pf("%d\n", x)
#define output(x, y); pf("Case %d: %d", ++x, y)
#define newLine pf("\n")
#define sf scanf
#define READ(f) freopen(f, "r", stdin)
#define WRITE(f) freopen(f, "w", stdout)
#if ( _WIN32 or __WIN32__ )
#define LLD "%I64d"
#else
#define LLD "%lld"
#endif
#define SDLL(x) sf(LLD, &x)
#define SDuLL(x) sf("%I64u", &x)
#define MAX3 1000
#define MAX5 100000
#define MAX7 10000000
#define MAX9 1000000000
#define MOD7 (MAX7 + 7)
#define MOD9 (MAX9 + 9)

typedef long long i64;
typedef unsigned long long ui64;
const i64 INF64 = (i64)1E18;

class TimeTracker {
    clock_t start, end;
public:
    TimeTracker() {
        start = clock();
    }
    ~TimeTracker() {
        end = clock();
        fprintf(stderr, "%.3lf s\n", (double)(end - start) / CLOCKS_PER_SEC);
    }
};

string toString(int num) {
    ostringstream convert;
    convert << num;
    return convert.str();
}

struct Point {
    int x, y;
    Point(): x(0), y(0) {}
    Point(int a, int b): x(a), y(b) {}
    bool operator < (const Point& other) const {
        return x < other.x;
    }
};
// BitMask
int Set(int N, int pos) {
    return N = N | (1 << pos);
}
int Reset(int N, int pos) {
    return N = N & ~(1 << pos);
}
int Check(int N, int pos) {
    return (N & (1 << pos));
}
int toggle(int N, int pos) {
    if( Check(N, pos) )
        return N = Reset(N, pos);
    return N = Set(N, pos);
}

// direction array
int dx[] = {0, 0, 1};
int dy[] = {1, -1, 0};
//int Dx[] = {0, -1, -1, -1, 0, 1, 1, 1};
//int Dy[] = {-1, -1, 0, 1, 1, 1, 0, -1};
int row, col, maxDepth;
bool isValid(int i, int j) {
    return i > 0 and j > 0 and i <= row and j <= col;
}

/** Implementation **/

#define MAX 301
int n, m, k;
bool visited[MAX][MAX];

void dfs(int idx, int depth, int x, int y) {
    if(idx > k) {
        return;
    }
    if(depth > maxDepth) {
        maxDepth = 2;
        printf("\n%d ", maxDepth);
        dfs(idx + 1, 1, x, y);
        return;
    }
    print(x); print(y);
    visited[x][y] = true;
    for(int i = 0; i < sizeof(dx) / sizeof(dx[0]); ++i) {
        int Y = y + dy[i];
        int X = x + dx[i];
//        cout << "\nX, Y: " << X << " " << Y << endl;
//        cout << "visited[X][Y]: " << visited[X][Y] << endl;
        if(isValid(X, Y) and !visited[X][Y]) {
            dfs(idx, depth + 1, X, Y);
            break;
        }
    }
}

int main(void) {
#ifndef ONLINE_JUDGE
     READ("input.txt");
//     WRITE("output.txt");
#endif
    SD3(n, m, k);
    row = n, col = m;
    assert(k <= n * m);
    maxDepth = n * m - (k - 1) * 2;
    print(maxDepth);
    dfs(1, 1, 1, 1);
    return EXIT_SUCCESS;
}
