#include<fstream>
#include<cstring>
using namespace std;
class GRAF{
public:
GRAF(int n, int m, int orn);
void add(int a, int b);
int* muchii(int a);
private:
int *nxt, *last, *val, *mch, cnt, kn;
};
GRAF::GRAF(int n, int m, int orn):cnt(0), kn(orn){
nxt = new int [m + 1];
memset(nxt, 0, sizeof(int) * (m + 1) );
val = new int [m + 1];
memset(val, 0, sizeof(int) * (m + 1) );
last = new int [n + 1];
memset(last, 0, sizeof(int) * (n + 1) );
mch = new int [min(n, m) + 1];
val[0] = 0;
nxt[0] = 0;
last[0] = 0;
}
void GRAF::add(int a, int b){
cnt++;
val[cnt] = b;
nxt[cnt] = last[a];
last[a] = cnt;
}
int* GRAF::muchii(int a){
mch[0] = 0;
for(int p = last[a]; p; p = nxt[p]){
mch[++mch[0]] = val[p] - kn;
}
return mch;
}
int cuplaj(int n, GRAF &G, int* &cuplat_dr, int* &cuplat_st, int* &viz){
int *v = G.muchii(n);
if(viz[n])return 0;
viz[n] = 1;
for(int i = 1; i <= v[0]; i++)
if(!cuplat_dr[v[i]]){
cuplat_dr[v[i]] = n;
cuplat_st[n] = v[i];
return 1;
}
for(int i = 1; i <= v[i]; i++)
if(cuplaj(cuplat_dr[v[i]], G, cuplat_dr, cuplat_st, viz)){
cuplat_st[n] = v[i];
cuplat_dr[v[i]] = n;
return 1;
}
return 0;
}
int main(){
ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");
int *cuplat_dr,*cuplat_st, a, b, n, m, e, *viz;
fin >> n >> m >> e;
GRAF G(n + m, e, n);
cuplat_dr = new int[n + 1];
memset(cuplat_dr, 0, sizeof(int) * (n + 1) );
cuplat_st = new int[m + 1];
memset(cuplat_st, 0, sizeof(int) * (m + 1) );
viz = new int[n + 1];
for(int i = 1; i <= e; i++){
fin >> a >> b;
G.add(a, b + n);
}
int* debug = G.muchii(1);
bool be = 1;
while(be){
memset(viz, 0, sizeof(int) * (n + 1));
be = 0;
for(int i = 1; i <= n; i++){
if(!cuplat_st[i])
if(cuplaj(i, G, cuplat_dr, cuplat_st, viz))
be = 1;
}
}
int rasp = 0;
for(int i = 1; i <= n; i++)
if(cuplat_st[i])
rasp++;
fout << rasp << endl;
for(int i = 1; i <= n; i++)
if(cuplat_st[i])
fout << i << ' ' << cuplat_st[i] << endl;
return 0;
}