#include <iostream>
#include <vector>
#include <cmath>
#include <algorithm>

struct Triangle
{
	double a, b, c;
	double perimeter, area;
	
	Triangle(double in_a, double in_b, double in_c, double in_p, double in_area) : a(in_a), b(in_b), 
		c(in_c), perimeter(in_p), area(in_area) {};
};

class Trinagles
{
	std::vector<Triangle> triangles;
	
public:
	void add( double a, double b, double c )
	{
		if (a >= b + c || b >= a + c || c >= a + b || a <= 0 || b <= 0 || c <= 0)
			return;
		
		int p = (a + b + c) / 2;
		triangles.push_back(Triangle(a, b, c, a + b + c, sqrt(p * (p - a) * (p - b) * (p - c))));
	}
	
	void ans()
	{
		sort (triangles.begin(), triangles.end(), [](Triangle a, Triangle b) {return a.perimeter < b.perimeter;});
		std::cout << "Perimeters: ";
		for (int i = 0; i < triangles.size(); i++)
			std::cout << triangles[i].perimeter << " ";
		std::cout << std::endl;
		
		std::cout << "Areas: ";
		sort (triangles.begin(), triangles.end(), [](Triangle a, Triangle b) {return a.area > b.area;});
		for (int i = 0; i < triangles.size(); i++)
			std::cout << triangles[i].area << " ";
	}
};

int main() {
	Trinagles t;
	
	t.add(3, 5, 5);
	t.add(5, 6, 7);
	t.add(6, 7, 8);
	t.ans();
	return 0;
}