#include<bits/stdc++.h>
#define inf 1<<29
#define linf (1e16)
#define eps (1e-8)
#define Eps (1e-15)
#define mod 1000000007
#define pi acos(-1.0)
#define phi (1.0+sqrt(5.0))/2.0
#define f first
#define s second
#define mp make_pair
#define pb push_back
#define all(a) (a).begin(),(a).end()
#define pd(a) printf("%.10f\n",(double)(a))
#define pld(a) printf("%.10Lf\n",(ld)(a))
#define FOR(i,a,b) for(int i=(a);i<(b);i++)
#define RFOR(i,a,b) for(int i=(a)-1;(b)<=i;i--)
#define Unique(v) v.erase(unique(all(v)),v.end())
#define equals(a,b) (fabs((a)-(b))<eps)
using namespace std;
typedef long double ld;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef pair<int,double> pid;
typedef pair<double,int> pdi;
typedef pair<double,double> pdd;
typedef vector<int> vi;
typedef vector<pii> vpi;

class Point{
public:
  double x,y;
  Point(double x=0,double y=0):x(x),y(y){}

  Point operator+(Point p){ return Point(x+p.x,y+p.y);}
  Point operator-(Point p){ return Point(x-p.x,y-p.y);}
  Point operator*(double k){ return Point(x*k,y*k);}
  Point operator/(double k){ return Point(x/k,y/k);}
  bool operator<(Point p)const{ 
    return equals(x,p.x) ? y-p.y<-eps : x-p.x<-eps; }
  bool operator==(Point p)const{ 
    return fabs(x-p.x)<eps && fabs(y-p.y)<eps;}

  double abs(){ return sqrt(norm());}
  double norm(){ return (x*x+y*y);}
};
typedef Point Vector;
typedef vector<Point> Polygon;

class Segment{
public:
  Point p1,p2;
  Segment(Point p1=Point(),Point p2=Point()):p1(p1),p2(p2){}
};
typedef Segment Line;

double norm(Vector a){ return (a.x*a.x+a.y*a.y);}
double abs(Vector a){ return sqrt(norm(a));}
double dot(Vector a,Vector b){ return (a.x*b.x+a.y*b.y);}
double cross(Vector a,Vector b){ return (a.x*b.y-a.y*b.x);}

Point project(Segment s,Point p){
  Vector base=(s.p2-s.p1);
  double r=(dot(p-s.p1,base)/base.norm());
  return (s.p1+base*r);
}

int ccw(Point p0,Point p1,Point p2){
  Vector a=p1-p0;
  Vector b=p2-p0;
  if(cross(a,b)>eps)return 1;
  if(cross(a,b)<-eps)return -1;
  if(dot(a,b)<-eps)return 2;
  if(a.norm()<b.norm())return -2;
  return 0;
}

bool isParallel(Segment s,Segment t){
  return equals(cross(s.p1-s.p2,t.p1-t.p2),0.0);
}

Point getCrossPointLL(Line a,Line b){
  double A=cross(a.p2-a.p1,b.p2-b.p1);
  double B=cross(a.p2-a.p1,a.p2-b.p1);
  if(abs(A)<eps || abs(B)<eps)return b.p1;
  return b.p1+(b.p2-b.p1)*(B/A);
}

bool check(Polygon a,Polygon b){
  FOR(i,0,3){
    Point a1=a[i],a2=a[(i+1)%3],a3=a[(i+2)%3];
    Vector v1=a1-project(Line(a2,a3),a1);
    Line l1=Line(a2+v1,a3+v1);
    FOR(j,0,3){
      Point b1=b[j],b2=b[(j+1)%3],b3=b[(j+2)%3];
      if(abs(ccw(l1.p1,l1.p2,b1))!=1){
        Vector v2;
        Line l2;
        v2=a2-project(Line(b1,a3),a2);
        l2=Line(b1+v2,a3+v2);
        if(abs(ccw(l2.p1,l2.p2,b2))!=1 && ccw(b1,b2,b3)*ccw(b1,b2,a3)==1)return true;
        if(abs(ccw(l2.p1,l2.p2,b3))!=1 && ccw(b1,b3,b2)*ccw(b1,b3,a3)==1)return true;
        v2=a3-project(Line(b1,a2),a3);
        l2=Line(b1+v2,a2+v2);
        if(abs(ccw(l2.p1,l2.p2,b2))!=1 && ccw(b1,b2,b3)*ccw(b1,b2,a2)==1)return true;
        if(abs(ccw(l2.p1,l2.p2,b3))!=1 && ccw(b1,b3,b2)*ccw(b1,b3,a2)==1)return true;
      }
    }
  }
  return false;
}

Point get(Point a,Point b,Point c,Point d){
  Vector v1=b-project(Line(a,d),b),v2=c-project(Line(a,b),c);
  Line l1(a+v1,d+v1),l2(a+v2,b+v2);
  return getCrossPointLL(l1,l2);
}

string solve(Polygon a,Polygon b){
  if(check(a,b))return "3";
  FOR(i,0,3){
    Point a1=a[i],a2=a[(i+1)%3],a3=a[(i+2)%3];
    FOR(j,0,3){
      Point b1=b[j],b2=b[(j+1)%3],b3=b[(j+2)%3];
      if(abs(ccw(a1,a2,b1))==1){
        Polygon p;
        p.pb(a1);
        p.pb(get(a1,a2,a3,b1));
        p.pb(a2);
        if(check(p,b))return "4";
      }
      if(abs(ccw(a1,a3,b1))==1){
        Polygon p;
        p.pb(a1);
        p.pb(a3);
        p.pb(get(a1,a3,a2,b1));
        if(check(p,b))return "4";
      }
      Vector v1 = a1-project(Line(a2,a3),a1);
      Line l1 = Line(a2+v1,a3+v1);
      if(abs(ccw(l1.p1,l1.p2,b1))!=1){
        Point c;
        c=get(a3,a1,a2,b2);
        if(ccw(b1,b2,c)*ccw(b1,b2,b3)==1)return "4";
        c=get(a2,a1,a3,b2);
        if(ccw(b1,b2,c)*ccw(b1,b2,b3)==1)return "4";
        c=get(a3,a1,a2,b3);
        if(ccw(b1,b2,c)*ccw(b1,b3,b2)==1)return "4";
        c=get(a2,a1,a3,b3);
        if(ccw(b1,b3,c)*ccw(b1,b3,b2)==1)return "4";
      }
    }
  }
	return "Many";
}

int main()
{
	int x,y;
  while(cin>>x>>y){
		Polygon a,b;
		a.pb(Point(x,y));
		FOR(i,0,2){
			cin>>x>>y;
			a.pb(Point(x,y));
		}
		FOR(i,0,3){
			cin>>x>>y;
			b.pb(Point(x,y));
		}
    cout<<solve(a,b)<<endl;
  }
  return 0;
}

Measured memory_bytes: 3180