#include<bits/stdc++.h>
using namespace std;
int An,Pn,Qn,n;
const int maxn = 1000;
const int inf = 2147483647;
struct edge{
int to,next,val;
}e[maxn];
int dis[maxn],now[maxn],head[maxn];
int S,T;
int cnt = 1;
void addedge(int u,int v,int w){
cnt++;
e[cnt].to = v;
e[cnt].val = w;
e[cnt].next = head[u];
head[u] = cnt;
cnt++;
e[cnt].to = u;
e[cnt].val = 0;;
e[cnt].next = head[v];
head[v] = cnt;
}
int bfs(){
for(int i = 1;i <= maxn;i++) dis[i] = inf;
queue<int> q;
q.push(S);
dis[S] = 0;
now[S] = head[S];
while(!q.empty()){
int x = q.front();
q.pop();
for(int i = head[x];i;i = e[i].next){
int y = e[i].to;
if(e[i].val>0&&dis[y]==inf){
q.push(y);
now[y] = head[y];
dis[y] = dis[x]+1;
if(y == T) return 1;
}
}
}
return 0;
}
int dfs(int x,int sum){
if(x == T) return sum;
int k,res = 0;
for(int i = now[x];i&∑i=e[i].next){
now[x] = i;
int y = e[i].to;
if(e[i].val>0&&(dis[y]==dis[x]+1)){
k = dfs(y,min(sum,e[i].val));
if(k == 0) dis[y] = inf;
e[i].val -= k;
e[i^1].val += k;
res+=k;
sum-=k;
}
}
return res;
}
int dinic(){
int ans = 0;
while(bfs()){
ans += dfs(S,inf);
}
return ans;
}
bool room[maxn][maxn],dish[maxn][maxn],rd[maxn][maxn],edg[maxn][maxn];
int main(){
cin>>An>>Pn>>Qn;
int tot;
S = 1,T = An+2*Pn+Qn+2;
for(int i = 1;i <= An;i++){
addedge(1,i+1,1);
cout<<1<<"a"<<i+1<<endl;
n++;
}
for(int i = 1;i <= An;i++){
for(int j = 1;j <= Pn;j++){
bool flag;
cin>>flag;
room[i][j] = flag;
}
}
for(int i = 1;i <= An;i++){
for(int j = 1;j <= Qn;j++){
bool flag;
cin>>flag;
dish[i][j] = flag;
}
}
for(int i = 1;i <= An;i++){
for(int j = 1;j <= Pn;j++){
if(room[i][j]){
if(!edg[i+1][An+j+1]){
addedge(i+1,An+j+1,1);
edg[i+1][An+j+1] = true;
cout<<i+1<<"b"<<An+j+1<<endl;
}
if(!edg[An+j+1][An+Pn+j+1]){
addedge(An+j+1,An+Pn+j+1,1);
cout<<An+j+1<<"b"<<An+Pn+j+1<<endl;
edg[An+j+1][An+Pn+j+1] = true;
}
}
}
}
for(int i = 1;i <= An;i++){
for(int j = 1;j <= Qn;j++){
if(dish[i][j]){
for(int k = 1;k <= Pn;k++){
if(room[i][k]){
if(!edg[An+Pn+k+1][An+2*Pn+j+1]){
addedge(An+Pn+k+1,An+2*Pn+j+1,1);
cout<<An+Pn+k+1<<"c"<<An+2*Pn+j+1<<endl;
edg[An+Pn+k+1][An+2*Pn+j+1] = true;
}
if(!edg[An+2*Pn+j+1][An+2*Pn+Qn+2]){
addedge(An+2*Pn+j+1,An+2*Pn+Qn+2,1);
cout<<An+2*Pn+j+1<<"c"<<An+2*Pn+Qn+2<<endl;
edg[An+2*Pn+j+1][An+2*Pn+Qn+2] = true;
}
}
}
}
}
}
cout<<dinic()<<endl;
}