#include<bits/stdc++.h>
typedef long long int ll;
typedef unsigned long long int ull;
#define BIG_NUM 2000000000
#define HUGE_NUM 99999999999999999
#define MOD 1000000007
#define EPS 0.000000001
using namespace std;


struct Point{
	Point(double arg_x,double arg_y){
		x = arg_x;
		y = arg_y;
	}

	Point(){
		x = y = 0.0;
	}

	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 a){ return Point(a*x,a*y); }
	Point operator / (double a){ return Point(x/a,y/a); }

	double abs(){ return sqrt(norm()); }
	double norm(){ return x*x + y*y; }

	bool operator<(const Point &p) const{
		return x != p.x? x < p.x: y < p.y;
	}

	bool operator == (const Point &p) const{
		return fabs(x-p.x) < EPS && fabs(y-p.y) < EPS;
	}

	double x,y;
};

struct Line{
	Line(){

	}
	Line(Point a,Point b){
		p[0] = a;
		p[1] = b;
	}
	Point p[2];
};

Point FROM[3],TO[3],work[3];

double calc_slope(Line A){

	if(fabs(A.p[0].x-A.p[1].x) < EPS){

		return DBL_MAX;

	}else if(fabs(A.p[0].y-A.p[1].y) < EPS){

		return 0;

	}else{

		return (A.p[0].y-A.p[1].y)/(A.p[0].x-A.p[1].x);
	}
}

bool is_parallel(Line A,Line B){

	return fabs(calc_slope(A)-calc_slope(B)) < EPS;
}

//交点を求める関数
Point calc_Cross_Point(double x1,double x2,double x3,double x4,double y1,double y2,double y3,double y4){
	Point ret;
	ret.x = ((x2-x1)*(y3*(x4-x3)+x3*(y3-y4))-(x4-x3)*(y1*(x2-x1)+x1*(y1-y2)))/((y2-y1)*(x4-x3)-(y4-y3)*(x2-x1));
	if(x1 != x2){
		ret.y = ((y2-y1)*ret.x+y1*(x2-x1)+x1*(y1-y2))/(x2-x1);
	}else{
		ret.y = ((y4-y3)*ret.x+y3*(x4-x3)+x3*(y3-y4))/(x4-x3);
	}
	return ret;
}

//インタフェース関数
Point calc_Cross_Point(Point a,Point b,Point c,Point d){
	return calc_Cross_Point(a.x,b.x,c.x,d.x,a.y,b.y,c.y,d.y);
}

Point calc_Cross_Point(Line A,Line B){

	return calc_Cross_Point(A.p[0],A.p[1],B.p[0],B.p[1]);
}

void func(){


	int from[3] = {0,1,2};
	Line line_from,line_to;

	//3か判定
	do{

		int to[3] = {0,1,2};
		do{

			bool FLG = true;

			for(int i = 0; i < 3; i++){

				work[i] = FROM[from[i]];
			}

			for(int i = 0; i < 3; i++){

				switch(i){
				case 0: //1と2が動かない

					line_from.p[0] = work[1];
					line_from.p[1] = work[2];

					line_to.p[0] = work[0];

					break;
				case 1: //0と2が動かない

					line_from.p[0] = work[0];
					line_from.p[1] = work[2];

					line_to.p[0] = work[1];

					break;
				case 2: //0と1が動かない

					line_from.p[0] = work[0];
					line_from.p[1] = work[1];

					line_to.p[0] = work[2];

					break;
				}
				line_to.p[1] = TO[to[i]];

				if(!is_parallel(line_from,line_to)){

					FLG = false;
					break;
				}
				work[i] = TO[to[i]];
			}

			if(FLG){

				printf("3\n");
				return;
			}

		}while(next_permutation(to,to+3));

	}while(next_permutation(from,from+3));


	int table[4],calc[4];
	bool SKIP_FLG;


	int rest[2],rest_index;

	//4か判定
	for(int i = 0; i < 3; i++){ //2回動かす点

		rest_index = 0;
		for(int k = 0; k < 3; k++){
			if(k == i)continue;

			rest[rest_index++] = k; //1回しか動かさない点
		}

		for(int k = 0; k < 4; k++){

			calc[k] = k; //3を2個目のiと見なす
		}

		do{ //2回動かす点を選択した時の、点を動かす順番のループ

			SKIP_FLG = false;

			for(int k = 0; k < 4; k++){
				if(calc[k] == 3){

					table[k] = i;

				}else{

					table[k] = calc[k];
				}
			}

			for(int k = 0; k < 3; k++){
				if(table[k] == table[k+1]){ //同じ点を2回続けて動かすのは無意味

					SKIP_FLG = false;
					break;
				}
			}
			if(SKIP_FLG)continue;


			int to[3] = {0,1,2};
			int match[3];

			do{ //FROMの点を一致させるTOの点の順番のループ

				for(int k = 0; k < 3; k++){

					work[k] = FROM[k];
				}
				int to_index = 0;

				//どの点をどの点にマッチさせるか
				bool is_First = true;
				int first = 5,last = -1,move_3;

				for(int k = 0; k < 4; k++){
					int move = table[k];
					move_3 = move;
					if(move == i){
						first = min(first,i);
						last = k;
					}
					if(move == i && is_First){

						is_First = false;
						continue;
					}
					match[move] = to[to_index++];
				}


				is_First = true;
				to_index = 0;
				bool FLG = true;

				for(int k = 0; k < 4; k++){
					//今回動かす点
					int move = table[k];

					if(move == i && is_First == true){ //2回動かす点

						line_to.p[1] = work[rest[0]];
						line_to.p[0] = work[rest[1]];

						double tmp_slope1 = calc_slope(line_to);

						line_to.p[0] = work[move];
						if(fabs(tmp_slope1-DBL_MAX) > EPS){
							line_to.p[1] = Point(work[move].x+1000,work[move].y+1000*tmp_slope1);
						}else{

							line_to.p[1] = Point(work[move].x,work[move].y-1000);
						}

						if(last == 3){

							line_from.p[1] = TO[match[rest[0]]];
							line_from.p[0] = TO[match[rest[1]]];

						}else{ //last == 2

							if(move_3 == rest[0]){ //最後に動くのがrest[0]

								line_from.p[1] = work[rest[0]];
								line_from.p[0] = TO[match[rest[1]]];

							}else{ //move_3 == rest[1]

								line_from.p[1] = work[rest[1]];
								line_from.p[0] = TO[match[rest[0]]];
							}
						}

						double tmp_slope2 = calc_slope(line_from);

						line_from.p[1] = TO[match[move]];
						if(fabs(tmp_slope2-DBL_MAX) > EPS){
							line_from.p[0] = Point(TO[match[move]].x+1000,TO[match[move]].y+1000*tmp_slope2);
						}else{

							line_from.p[0] = Point(TO[match[move]].x,TO[match[move]].y-1000);
						}

						Point next_point = calc_Cross_Point(line_from,line_to);

						work[move] = next_point;

						is_First = false;

					}else{ //TO[to[to_index]]にマッチさせる

						switch(move){
						case 0: //1と2が動かない

							line_from.p[0] = work[1];
							line_from.p[1] = work[2];

							line_to.p[0] = work[0];

							break;
						case 1: //0と2が動かない

							line_from.p[0] = work[0];
							line_from.p[1] = work[2];

							line_to.p[0] = work[1];

							break;
						case 2: //0と1が動かない

							line_from.p[0] = work[0];
							line_from.p[1] = work[1];

							line_to.p[0] = work[2];

							break;
						}
						line_to.p[1] = TO[to[to_index]];
						if(!is_parallel(line_from,line_to)){

							FLG = false;
							break;
						}
						work[move] = TO[to[to_index++]];
					}
				}

				if(FLG){

					printf("4\n");
					return;
				}

			}while(next_permutation(to,to+3));

		}while(next_permutation(calc,calc+4));
	}

	printf("Many\n");
}


int main(){

	while(scanf("%lf %lf",&FROM[0].x,&FROM[0].y) != EOF){

		for(int i = 1; i <= 2; i++){

			scanf("%lf %lf",&FROM[i].x,&FROM[i].y);
		}

		for(int i = 0; i <= 2; i++){

			scanf("%lf %lf",&TO[i].x,&TO[i].y);
		}
		func();
	}
	return 0;
}



Measured memory_bytes: 3204