{$APPTYPE CONSOLE}

const
  NMAX = 100;
  MMAX = 100;

type
  TQNode = record
    prev: Integer;
    value: Integer;
  end;

var
  a: array[1..NMAX,1..MMAX] of Byte;
  n,m,k: Integer;
  i,j,ai,bi,v: Integer;
  find_any: boolean;

  //текущее максимальное паросочетание
  mpleft: array [1..NMAX] of Integer;
  mpright: array [1..MMAX] of Integer;

  //очередь для поиска чередующейся цепочки
  chain: array[1..NMAX*MMAX] of TQNode;
  back: Integer;
  front: Integer;
  visited: array[-MMAX..NMAX] of Byte;

  //независимое множество
  mnm: array[-MMAX..NMAX] of Byte;
  count: Integer;

begin

//  assign(input,'input.txt'); reset(input);
//  assign(output,'output.txt'); rewrite(output);

  fillchar(a,sizeof(a),0);
  readln(n,m,k);
  for i:=1 to k do begin
    readln(ai,bi);
    a[ai,bi]:=1;
  end;

  //Ищем максимальное паросочетание
  fillchar(mpleft,sizeof(mpleft),0);
  fillchar(mpright,sizeof(mpright),0);

  repeat
    {ищем очередную чередующуюся цепочку}
    find_any:=false;

    {перебираем вершины - кандидаты на роль начала цепочки}
    for j:=1 to n do if mpleft[j]=0 then
    begin
      fillchar(visited,sizeof(visited),0);
      back := 1;
      chain[back].prev := 0;
      chain[back].value := j;
      front := 0;
      visited[j]:=1;

      //цикл, в котором формируется цепочка модификацией метода поиска в ширину
      repeat
        //берём очередную вершину очереди
        front := front+1;
        v:=chain[front].value;
        if v>0 then
        begin
          //ищем вершину справа, она должна быть непосещённой, ребро не должно входить в паросочетание
          //если вершина свободная, то цепочка найдена
          for i:=1 to m do
            if (a[v,i]=1) and (visited[-i]=0) then
              if mpleft[v]<>i then
              begin
                inc(back);
                chain[back].value := -i;
                chain[back].prev := front;
                visited[-i]:=1;
                if mpright[i]=0 then break;
              end;
           if chain[back].value<0 then
             if mpright[-chain[back].value]=0 then break;
        end else
        begin
          //ищем вершину слева, она должна быть непосещённой, ребро должно входить в паросочетание
          for i:=1 to n do
            if (a[i,-v]=1) and (visited[i]=0) then
              if mpleft[i]=-v then
              begin
                inc(back);
                chain[back].value := i;
                chain[back].prev := front;
                visited[i]:=1;
              end;
        end;
      until front=back;

      //если цепочку найти не удалось, пробуем другую вершину
      if chain[back].value > 0 then continue;
      if mpright[-chain[back].value]<>0 then continue;

      //чередующаяся цепочка найдена - корректируем максимальное паросочетание
      //справа налево - удаляем, слева направо - устанавливаем
      find_any := true;
      while chain[back].prev>0 do
      begin
        v := chain[back].value;
        if v<0 then begin
          //v-справа, т.е. нужно добавить ребро в максимальное паросочетание
          mpright[-v]:=chain[chain[back].prev].value;
          mpleft[chain[chain[back].prev].value]:=-v;
        end;
        back := chain[back].prev;
      end;
      break; //снова начнем с первой вершины

    end;

  until not find_any;

  //ищем максимальное независмое множество

  fillchar(mnm,sizeof(mnm),0);

  //сначала берём вершины, не вошедшие в максимальное независимое подмножество
  for i:=1 to n do
    if mpleft[i]=0 then mnm[i]:=1;
  for i:=1 to m do
    if mpright[i]=0 then mnm[-i]:=1;

  //Ищем вершину, вошедшую в МНМ и соединяющуюся ребром вершиной из МП
  repeat
    find_any := false;
    //сначала в левой части
    for i:=1 to n do
      if mnm[i]=1 then
        for j:=1 to m do
          if (a[i,j]=1)and(mpright[j]<>0) then
          begin
            v:=mpright[j];
            mnm[v]:=1;
            mpleft[v]:=0;
            mpright[j]:=0;
            find_any:=true;
            break;
           end;
    //затем - в правой части
    for i:=1 to m do
      if mnm[-i]=1 then
        for j:=1 to n do
          if (a[j,i]=1) and (mpleft[j]<>0) then
          begin
            v:=mpleft[j];
            mnm[-v]:=1;
            mpleft[j]:=0;
            mpright[v]:=0;
            find_any := true;
            break;
          end;
  until not find_any;

  //добавляем то, что осталось
  for i:=1 to n do
    if mpleft[i]<>0 then
      mnm[i]:=1;

  //выводим то, что получилось
  count := 0;
  mnm[0]:=1;
  for i:=-m to n do
    if mnm[i]=0 then inc(count);
  writeln(count);
  for i:=1 to n do
    if mnm[i]=0 then writeln('A',i);
  for i:=1 to m do
    if mnm[-i]=0 then writeln('B',i);
end.
