private static Vertex tryGetNorm(Vertex input) {

		Vertex v = input;
		int curDfs;

		while (true) {
			v = new NiceVertex(v);
			curDfs = dfsFindRedexes(v);
			if (curDfs < 0) {
				return v;
			}
			//System.out.println("Step : " + v);
			//System.out.println("curDfs = " + curDfs);
			DebugInformer.gettingNormBigStep++;
			if (DebugInformer.gettingNormBigStep % 100 == 0) {
				DebugInformer.printStatistics();
				System.gc();
			}
			if (curDfs == 0) {
				v = reductRedex(v);
				continue;
			}
			Vertex t = v;
			for (; ; ) {
				//System.out.println("T: " + t);
				//System.out.println("l : " + dfsFindRedexes(t.left) + "  r : " + dfsFindRedexes(t.right) + "   t : " + dfsFindRedexes(t));
				int x = dfsFindRedexes(t.left);
				if (x == 0) {
					t.left = reductRedex(t.left);
					break;
				}
				if (x > 0) {
					t = t.left;
					continue;
				}
				x = dfsFindRedexes(t.right);
				if (x == 0) {
					t.right = reductRedex(t.right);
					break;
				}
				t = t.right;
			}
		}
	}