Problem:
宇宙船 UAZ アドバンス号

恒星歴 2005.11.5。あなたは宇宙船 UAZ アドバンス号の艦長として敵の宇宙船と交戦しようとしています。 幸い敵の宇宙船はまだこちらに気付かずに静止しています。また、すでに敵の宇宙座標は判明しており強力な直線のビームを放つ「フェザー砲」は発射準備を完了しています。あとは、発射命令を出すばかりです。

ところが、宇宙空間には、敵の設置したエネルギーバリアが存在しています。バリアは三角形をしており「フェザー砲」のビームをはね返してしまいます。また、ビームがバリアに当たれば敵に気付かれて逃げられてしまいます。事前に命中すると判定できなければ、発射命令は出せません。

そこで、UAZ アドバンス号、敵、バリアの位置の宇宙座標(3次元座標 x, y, z) を入力して、ビームがバリアをさけて敵に命中する場合は "HIT"、バリアに当たってしまう場合"MISS"と出力するプログラムを作成してください。

ただし、バリアはアドバンス号から 3 角形に見えるものだけが対象であり、線分につぶれて見えるものはないものとします。また、バリアは 3 角形の頂点を含む境界でも有効であり、ビームをはね返すものとします。また、敵がバリア内にいる場合は"MISS"と出力して下さい。

Input

入力データの形式は以下のとおりです：

1 行目は、UAZ アドバンス号の座標 (x, y, z) (整数、半角空白区切り)

2 行目は、敵の座標 (x, y, z) (整数、半角空白区切り)

3 行目は、バリアの頂点 1 の座標 (x, y, z) (整数、半角空白区切り)

4 行目は、バリアの頂点 2 の座標 (x, y, z ) (整数、半角空白区切り)

5 行目は、バリアの頂点 3 の座標 (x, y, z ) (整数、半角空白区切り)

Output

HIT または MISS と１行に出力してください。

Constraints

-100 ≤ x, y, z ≤ 100

UAZ アドバンス号と敵が同じ位置にいることはない。

Sample Input 1

-10 0 0
10 0 0
0 10 0
0 10 10
0 0 10

Output for the Sample Input 1

HIT

Sample Input 2

-10 6 6
10 6 6
0 10 0
0 10 10
0 0 10

Output for the Sample Input 2

MISS

Solution in JAVA (judge verdict: Wrong Answer)

public class Main{
  static double eps = 0.0000001;
  public void run(java.io.InputStream in, java.io.PrintStream out){
    java.util.Scanner sc = new java.util.Scanner(in);
    double ux, uy, uz, ex, ey, ez;
    double[] x, y, z, a, ainv, s;
    int i;
    x = new double[3]; y = new double[3]; z = new double[3];
    a = new double[9]; ainv = new double[9]; s = new double[3];

    ux = sc.nextDouble(); uy = sc.nextDouble(); uz = sc.nextDouble();
    ex = sc.nextDouble(); ey = sc.nextDouble(); ez = sc.nextDouble();
    for(i = 0;i < 3;i++){
      x[i] = sc.nextDouble(); y[i] = sc.nextDouble(); z[i] = sc.nextDouble();
      a[i] = x[i] - ux; a[i + 3] = y[i] - uy; a[i + 6] = z[i] - uz;
    }
    getinv(a, ainv, 3);
    for(i = 0;i < 3;i++)
      s[i] = ainv[i * 3] * ex + ainv[i * 3 + 1] * ey + ainv[i * 3 + 2] * ez;
    if(solve(s))out.println("HIT");
    else out.println("MISS");

    sc.close();
  }
  public static void main(String[] args){
    (new Main()).run(System.in, System.out);
  }
  private static void getinv(double[] a, double[] ainv, int n){
    int i, j;
    double[][] x;
    x = new double[n][n * 2];
    for(i = 0;i < n;i++){
      for(j = 0;j < n;j++)x[i][j] = a[i * n + j];
      x[i][n + i] = 1;
    }
    for(i = 0;i < n;i++){
      for(j = i;j < n;j++)if(x[j][i] != 0)break;
      hswap(x, n, i, j);
      hdiv(x, n, i, x[i][i]);
      for(j = i + 1;j < n;j++)hdel(x, n, i, j);
    }
    for(i = 0;i < n;i++)for(j = 0;j < n;j++)ainv[n * i + j] = x[i][j + n];
    return;
  }
  private static void hswap(double[][] x, int n, int i, int j){
    int q;
    double tmp;
    for(q = 0;q < 2 * n;q++){
      tmp = x[i][q]; x[i][q] = x[j][q]; x[j][q] = tmp;
    }
    return;
  }
  private static void hdiv(double[][] x, int n, int i, double a){
    int q;
    for(q = i;q < n * 2;q++)x[i][q] /= a;
    return;
  }
  private static void hdel(double[][] x, int n, int i, int j){
    int q;
    double t = x[j][i];
    for(q = i;q < 2 * n;q++)x[j][q] -= x[i][q] * t;
    return;
  }
  private static boolean solve(double[] s){
    int i;
    for(i = 0;i < 3;i++)if(s[i] + eps < 0)return false;
    if(s[0] + s[1] + s[2] + eps <= 1.0)return false;
    return true;
  }
}