#include<complex>
#include<iostream>
#include<cmath>
#include<vector>
#include<algorithm>
#include<iomanip>
#include<cassert>
#define REP(i,s,n) for(int i=s;i<n;i++)
#define rep(i,n) REP(i,0,n)
#define EPS (1e-10)
#define COUNTER_CLOCKWISE 1
#define CLOCKWISE -1 
#define ONLINE_BACK 2
#define ONLINE_FRONT -2
#define ON_SEGMENT 0
#define equals(a,b) (fabs((a)-(b)) < EPS)
#define inf (1<<29)
 
using namespace std;
 
class Point
{
  public:
  double x,y;
 
  Point(double x = -1,double y = -1): x(x),y(y){}
 
  Point operator + (Point p ){return Point(x+p.x,y+p.y);}
  Point operator - (Point p){return Point(x-p.x,y-p.y);}
  Point operator * (double a){return Point(a*x,a*y);}
  Point operator / (double a){return Point(x/a,y/a);}//テ「ツ?サテッツスツイテッツスツケテッツセツ津ッツセツ敕」ツ?ォテゥツ卍静」ツつ?
 
  bool operator < (const Point& p) const
  {
    return x != p.x?x<p.x:y<p.y;
  }
 
  bool operator == (const Point& p)const
  {
    return fabs(x-p.x) < EPS && fabs(y-p.y) < EPS;
  }
 
//テ・ツソツ?ィツヲツ?」ツ?ォテ・ツソツ愿」ツ?佚」ツ?ヲ
double norm()
{
return x*x+y*y;
}
 
};
 
struct Segment
{
  Point p1,p2;
  Segment(Point p1 = Point(-1,-1),Point p2 = Point(-1,-1)):p1(p1),p2(p2){}
};
typedef Point Vector;
typedef Segment Line;
typedef vector<Point> Polygon;
 
 
double dot(Point a,Point b)
{
  return a.x*b.x + a.y*b.y;
}
double cross(Point a,Point b)
{
  return a.x*b.y - a.y*b.x;
}
 
double norm(Point a)
{
  return a.x*a.x+a.y*a.y;
}
 
double abs(Point a)
{
  return sqrt(norm(a));
}
 
bool pequals(Point a,Point b)
{
  return equals(a.x,b.x) && equals(a.y,b.y);
}
 
//rad テ」ツ?ッティツァツ津・ツコツヲテ」ツつ津」ツδゥテ」ツつクテ」ツつ「テ」ツδウテ」ツ?ァテヲツ個?」ツ?淌」ツ?崚」ツつ凝」ツ?禿」ツ?ィ
Point rotate(Point a,double rad)
{
  return Point(cos(rad)*a.x - sin(rad)*a.y,sin(rad)*a.x + cos(rad)*a.y);
}
 
// テ・ツコツヲテ」ツつ津」ツδゥテ」ツつクテ」ツつ「テ」ツδウテ」ツ?ォテ・ツ、ツ嘉ヲツ渉?
double toRad(double agl)
{
  return agl*M_PI/180.0;
}
 
double getArea(vector<Point>& vec)
{
  double sum = 0;
  for(int i=0;i<vec.size();i++)
    sum += cross(vec[i],vec[(i+1)%vec.size()]);
  return fabs(sum)/2.0;
}
 
double getDist(Point a,Point b)
{
  return sqrt(norm(a-b));
}
 
int ccw(Point p0,Point p1,Point p2)
{
  Point a = p1-p0;
  Point b = p2-p0;
  if(cross(a,b) > EPS)return COUNTER_CLOCKWISE;
  if(cross(a,b) < -EPS)return CLOCKWISE;
  if(dot(a,b) < -EPS)return ONLINE_BACK;
  if(norm(a) < norm(b))return ONLINE_FRONT;
  return ON_SEGMENT;
}
 
struct P
{
 
};
 
bool isIntersect(Point p1,Point p2,Point p3,Point p4)
{
  return (ccw(p1,p2,p3) * ccw(p1,p2,p4) <= 0 &&
          ccw(p3,p4,p1) * ccw(p3,p4,p2) <= 0 );
}
 
bool isIntersect(Segment s1,Segment s2)
{
  return isIntersect(s1.p1,s1.p2,s2.p1,s2.p2);
}
 
 
 
Point getCrossPoint(Point a1,Point a2,Point b1,Point b2)
{
  assert(isIntersect(a1,a2,b1,b2));//テ、ツコツ、テ・ツキツョテ」ツ?療」ツ?ヲテ」ツ??」ツ?ェテ」ツ??」ツ??」ツ?禿」ツつ古」ツつ津・ツ、ツ姪」ツ?療」ツ?ヲテ」ツつづ」ツ?づ」ツつ凝ァツィツ凝・ツコツヲテッツシツ暗」ツ?セテ」ツ?淌」ツ?ッテ」ツ?療」ツ?」テ」ツ?凝」ツつ甘ッツシツ淌ッツシツ嘉」ツ?ッテ」ツ??」ツ?氾」ツ??」ツ?ヲテ」ツ?湘」ツつ古」ツつ?
  Point base = b2 - b1;
  double d1 = abs(cross(base,a1-b1));
  double d2 = abs(cross(base,a2-b1));
  double t = d1/(d1+d2);
  return a1+(a2-a1)*t;
}
 
// Line Line テ、ツクツ甘」ツ?ィテ・ツ青古」ツ??assertテ」ツ?ェテ」ツ??
Point getCrossPointLines( Line s1, Line s2){
    Point a = s1.p2 - s1.p1;
    Point base = s2.p2 -s2.p1;
    return s1.p1 + a * (cross(base, s2.p1 - s1.p1)/cross(base, a));
}
 
//テ、ツクツ嘉ィツァツ津・ツスツ「ABCテ」ツ?ョテ・ツ??ヲツ篠・テ・ツ??・ツ債甘・ツセツ?」ツつ津ヲツアツづ」ツつ?」ツつ?
double getInradius(Point A,Point B,Point C)
{
  vector<Point> vec(3);
  vec[0] = A, vec[1] = B, vec[2] = C;
  double S = getArea(vec);
  double a = getDist(B,C);
  double b = getDist(A,C);
  double c = getDist(A,B);
  return 2.0*S/(a+b+c);
}
 
//segテ」ツつ池テ」ツ??」ツ?妥・ツケツウティツ。ツ古」ツ?ォテ」ツつケテ」ツδゥテ」ツつ、テ」ツδ?
Segment slideSeg(Segment seg,double r)
{
  Point p = (seg.p2-seg.p1)*r/abs(seg.p2-seg.p1);
  p = rotate(p,toRad(90.0));
  seg = Segment(seg.p1+p,seg.p2+p);
  if(fabs(seg.p1.x) < EPS)seg.p1.x = 0;
  if(fabs(seg.p1.y) < EPS)seg.p1.y = 0;
  if(fabs(seg.p2.x) < EPS)seg.p2.x = 0;
  if(fabs(seg.p2.y) < EPS)seg.p2.y = 0;
  return seg;
}
 
//テ、ツクツ嘉ィツァツ津・ツスツ「ABCテ」ツ?ョテ・ツ??・ツソツε」ツつ津ヲツアツづ」ツつ?」ツつ?
Point getIncenter(Point A,Point B,Point C)
{
  double inradius = getInradius(A,B,C);
 
  Segment seg1 = Segment(A,B);
  Segment seg2 = Segment(B,C);
  seg1 = slideSeg(seg1,inradius);
  seg2 = slideSeg(seg2,inradius);
  return getCrossPointLines(seg1,seg2);
}
 
 
//vector<Point> getMalfattieCircles(Point A,Point B,Point C)
void getMalfattieCircles(Point A,Point B,Point C)
{
  Point I = getIncenter(A,B,C);
  double r = getInradius(A,B,C);
  double a = getDist(B,C);
  double b = getDist(C,A);
  double c = getDist(A,B);
  double s = (a+b+c)/2.0;
  double IA = getDist(I,A);
  double IB = getDist(I,B);
  double IC = getDist(I,C);
 
  double r1 = ( r/(2.0*(s-a)) )*( s - r - (IB + IC - IA));
  double r2 = ( r/(2.0*(s-b)) )*( s - r - (IC + IA - IB));
  double r3 = ( r/(2.0*(s-c)) )*( s - r - (IA + IB - IC));
 
  cout << setiosflags(ios::fixed) << setprecision(6) << r1 << " " << r2 << " " << r3 << endl;
}
 
int main()
{
  while(true)
    {
      Point A,B,C;
      cin >> A.x >> A.y >> B.x >> B.y >> C.x >> C.y;
      if(A.x+A.y+B.x+B.y+C.x+C.y == 0)break;
      getMalfattieCircles(A,B,C);
    }
  return 0;
}

Measured memory_bytes: 1292