#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string.h>
#include<vector>
using namespace std;
int r,c,n,cnt,head[4010],lr[4010],lc[4010],link[4010],vis[4010],f[4010];
struct node{
int to,next;
}a[4000010];
int read(){
int s=0;
char ch=getchar();
while(ch<'0'||ch>'9')ch=getchar();
while(ch<='9'&&ch>='0'){
s=s*10+ch-'0';
ch=getchar();
}
return s;
}
void add(int u,int v){
++cnt;
a[cnt].to =v;
a[cnt].next =head[u];
head[u]=cnt;
}
int dfs(int x){
for(int i=head[x];i;i=a[i].next ){
int v=a[i].to ;
if(vis[v])continue;
vis[v]=1;
if(!link[v]||dfs(link[v])){
link[v]=x;
f[x]=1;
return 1;
}
}
return 0;
}
int js(){
int ans=0;
memset(link,0,sizeof(link));
for(int i=1;i<=n;i++){
memset(vis,0,sizeof(vis));
if(dfs(i)){
++ans;
//f[i]=1;
}
}
return ans;
}
void find(int x){
lr[x]=1;
for(int i=head[x];i;i=a[i].next ){
int v=a[i].to ;
if(link[v]&&!lr[link[v]]&&!lc[v]){
lc[v]=1;
find(link[v]);
}
}
}
void fin(){
memset(lr,0,sizeof(lr));
memset(lc,0,sizeof(lc));
for(int i=1;i<=r;i++)if(!f[i])find(i);
for(int i=1;i<=r;i++)if(!lr[i])cout<<"r"<<i<<" ";
cout<<endl;
for(int i=1;i<=c;i++)if(lc[i])cout<<"c"<<i<<" ";
cout<<endl;
}
int main(){
while(true){
r=read();c=read();n=read();
if(r==0&&c==0&&n==0)break;
memset(head,0,sizeof(head));
memset(f,0,sizeof(f));
for(int i=1;i<=n;i++){
int u,v;
u=read();v=read();
add(u,v);
}
cout<<js()<<endl;
fin();
}
return 0;
}