/*
	DRZAVNO TAKMICENJE 2007
	ZADATAK: plivanje
	AUTOR: Aleksandar Ilic, Nis

	Svaki takmicar je oznacen rednim brojem od 1 do n. Na pocetku ucitamo sve rezultate trka i u matrici a [n][4] pamtimo
	koliko puta je svaki takmicar bio prvi, drugi i treci. Ideja je da prodjemo po svim mogucim brojem poena za
	prvo i drugo mesto (dva ciklusa od 1 do p), a zatim da odredimo interval u kome mora da se nadje broj bodova
	za trece mesto - tako da takmicar sa rednim brojem 1 ima najvise poena. Na pocetku je taj interval [1, second - 1].
	Za svako 2 <= i <= n mora da vazi
	first * a [i][1] + second * a [i][2] + third * a [i][3] <= first * a [1][1] + second * a [1][2] + third * a [1][3] 

	Za ovakvu nejednakost po nepoznatoj third dobijamo gornje ili donje ogranicenje. Na kraju proverimo da li se
	u intervalu [minThird, maxThird] nalazi neki prirodan broj. Ukoliko je odgovor pozitivan prekidamo i stampamo rezultat, 
	a ukoliko takav broj ne postoji nastavljamo pretragu dalje.

	Vremenska slozenost algoritma je O (m + p^2 * n), dok je memorijska slozenost O (n).
	n - broj takmicara
	m - broj trka
	p - maksimalan broj bodova
	first, second, third - brojevi bodova za prvo, drugo i trece mesto
	sol - da li postoji resenje
*/

#include <iostream>
#include <fstream>
using namespace std;

int n, m, p, first, second, third;
int a [1001][4];
bool sol;
double minThird, maxThird;

int main ()
{
	/* Ucitavanje podataka */
	ifstream in ("plivanje.in");
	in >> n >> m >> p;
	for (int i = 1; i <= n; i++)
	    for (int j = 1; j <= 3; j++)
	        a [i][j] = 0;
	for (int i = 0; i < m; i++)
	{
        in >> first >> second >> third;
        a [first][1]++;
        a [second][2]++;
        a [third][3]++;
    }
	in.close();

    /* Fiksiranje brojeva first i second i nalazenje intervala za third */
	sol = false;
    for (first = p; first >= 3; first--)
	{
        for (second = first - 1; second >= 2; second--)
        {
            minThird = 1.0;
            maxThird = second - 1;
            for (int i = 2; i <= n; i++)
            {
                double x = first * (a [i][1] - a [1][1]) + second * (a [i][2] - a [1][2]);
                double y = a [1][3] - a [i][3];
				if ((y == 0) && (x > 0))
				{
					minThird = p;
					break;
				}
                if ((y > 0) && (minThird < x / y))
					minThird = x / y;
                if ((y < 0) && (maxThird > x / y))
					maxThird = x / y;
            }
            third = (int)maxThird;
            if (third >= minThird)
            {
                sol = true;
                break;
            }
        }
		if (sol == true)
			break;
	}

	/* Stampa rezultata */
	ofstream out ("plivanje.out");
	if (sol == false)
	     out << "-1" << endl;
    else
         out << first << " " << second << " " << third << endl;
 	out.close();
    return 0;
}
