#include <iostream>
using namespace std;

int main()
{
	unsigned long long n, a;
	cin >> n >> a;

	// Minimalni zbir poena u rezultatima je 3 * a, 
	// odnosno da su rezultati:
	// a 0
	// a 0
	// a 0
	// Ako je n manje od 3 * a, rezultat se ne moze napraviti,
	// jer ce zbir svih poena sigurno biti veci od n
	if (n < 3 * a)
		cout << -1 << "\n";
	else
	{
		unsigned long long preko_a = n - 2 * a;
		cout << preko_a / 2 + 1 << " " << preko_a / 2 - 1 << "\n";
		if (preko_a % 2 == 0) // (1)
			cout << a << " 0\n";
		else // (2)
			cout << a << " 1\n";
		cout << a << " 0\n";

		// (1)
		// Ako je preko_a parno, rezultate mozemo uvek da predstavimo kao:
		// (n - 2 * a) / 2 + 1  (n - 2 * a) / 2 - 1
		// a  0
		// a  0
		
		// Kada sve saberemo imamo: (n - 2 * a) / 2 + 1 + (n - 2 * a) / 2 - 1 + a + a = n / 2 - a + n / 2 - a + a + a + 1 - 1 = n

		// (2)
		// Ako je preko_a neparno, rezultate mozemo uvek da predstavimo kao:
		// // (n - 2 * a) / 2 + 1  (n - 2 * a) / 2 - 1
		// a  1
		// a  0

		// Kada sve saberemo imamo opet n, slicno kao i u prvom slucaju, samo sto ce ovde n / 2 morati da se flooruje i tu cemo izgubiti 0.5,
		// pa posto imamo dva n / 2 clana u izrazu ukupno ce rezultat biti manji za 1, pa zbog toga sluzi jedinica u drugom setu rezultata,
		// da nam dopuni izraz od n - 1 na n
	}

	return 0;
}