/*
Autorius: Vytis Banaitis
Tarkim, kad lentos langeliai yra grafo viršūnės ir jei tarp dviejų gretimų langelių nėra
linijos, tai tarp atitinkamų viršūnių egzistuoja briauna. Domino padėtas ant lentos
pakeičia atitinkamos briaunos būseną.
Pasirenkam bet kurį tuščią langelį ir nuo jo ieškome kelio iki bet kurio kito tuščio
langelio. Kas antra briauna šiame kelyje turi būti pakeistos būsenos, t.y. turi būti domino.
Radus tinkamą kelią, visų kelią sudarančių briaunų būsenos pakeičiamos. Kelių ieškome tol 
kol nelieka tuščių langelių.
*/
#include <cstdlib>
#include <cstdio>

#define INFILE "dom0.in"
#define OUTFILE "dom0.out"

using namespace std;
struct domino { short a, b; } dominoes[5000];
short dn;

short m, n, l[100][100][4], diff[4];
bool used[100][100];

void input()
{
     dn = 0;
     FILE *f = fopen(INFILE,"r");
     fscanf(f,"%hd%hd",&n,&m);
     diff[0] = -m;
     diff[1] = 1;
     diff[2] = m;
     diff[3] = -1;
     for (int i=0;i<n;i++)
         for (int j=0;j<m;j++) {
             l[i][j][0] = i ? 1 : 0;
             l[i][j][1] = j < m-1 ? 1 : 0;
             l[i][j][2] = i < n-1 ? 1 : 0;
             l[i][j][3] = j ? 1 : 0;
             used[i][j] = 0;
             }
     short L, a, b;
     fscanf(f,"%hd",&L);
     for (int ll=0;ll<L;ll++) {
         fscanf(f,"%hd%hd",&a,&b);
         --a; --b;
         for (int i=0;i<4;i++) if (a + diff[i] == b) {
             l[a/m][a%m][i] = 0;
             l[b/m][b%m][(i+2)%4] = 0;
             break;
             }
         }
     fclose(f);
}

bool findpath()
{
     int from[10000];
     for (int i=0;i<m*n;i++) from[i] = -1;
     int Q[10000], qs = 0, qe = 0;
     for (int i=0;i<m*n;i++) if (!used[i/m][i%m]) {
         Q[qe++] = i;
         used[i/m][i%m] = 1;
         break;
         }
     if (!qe) return 0;
     int end, a, b;
     while (qs < qe) {
           a = Q[qs++];
           for (int i=0;i<4;i++) if (l[a/m][a%m][i] == 1) {
               b = a + diff[i];
               if (from[b] >= 0) continue;
               from[b] = a;
               if (!used[b/m][b%m]) { end = b; qe = -1; break; }
               for (int j=0;j<4;j++) if (l[b/m][b%m][j] == 2) {
                   from[b+diff[j]] = b;
                   b += diff[j];
                   break;
                   }
               Q[qe++] = b;
               }
           }
     used[end/m][end%m] = 1;
     a = from[b = from[end]];
     while (a >= 0) {
           for (int i=0;i<4;i++) if (a+diff[i] == b) {
               l[a/m][a%m][i] = 1;
               l[b/m][b%m][(i+2)%4] = 1;
               break;
               }
           for (int i=0;i<4;i++) if (b+diff[i] == end) {
               l[b/m][b%m][i] = 2;
               l[end/m][end%m][(i+2)%4] = 2;
               break;
               }
           a = from[b = from[end = a]];
           }
     for (int i=0;i<4;i++) if (b+diff[i] == end) {
         l[b/m][b%m][i] = 2;
         l[end/m][end%m][(i+2)%4] = 2;
         break;
         }
     return 1;
}

void dosmth()
{
     while (findpath());
     FILE *f = fopen(OUTFILE,"w");
     for (int i=0;i<n;i++) for (int j=0;j<m;j++) {
         if (l[i][j][1] == 2) fprintf(f,"%d %d\n",i*m+j+1,i*m+j+2);
         if (l[i][j][2] == 2) fprintf(f,"%d %d\n",i*m+j+1,(i+1)*m+j+1);
         }
     fclose(f);
}

int main()
{
    input();
    dosmth();
    return 0;
}
