
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>
#include <set>
#include <map>
#include <cmath>
#include <sstream>
#include <iomanip>
using namespace std;
template <class T> void checkmin(T &t,T x){if (x < t) t = x;}
template <class T> void checkmax(T &t,T x){if (x > t) t = x;}
typedef pair <int,int> PII;
typedef pair <double,double> PDD;
#define foreach(it,v) for (__typeof((v).begin()) it = (v).begin();it != (v).end();it++)
const double EPS = 1e-8;

struct Point {
    double x, y,r;
};
#define zero(x) (fabs(x)<EPS?1:0)
double dmult(Point p1,Point p2,Point p0){
    return (p1.x-p0.x)*(p2.x-p0.x)+(p1.y-p0.y)*(p2.y-p0.y);
}
inline double xmult(const Point & p1, const Point & p2, const Point & p0) {
    return (p1.x - p0.x) * (p2.y - p0.y) - (p2.x - p0.x) * (p1.y - p0.y);
}
inline double dis(const Point & p1, const Point & p2) {
    return sqrt((p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y));
}

double disptoline(const Point & p, const Point & l1, const Point & l2) {
    return fabs(xmult(p, l1, l2)) / dis(l1, l2);
}

Point intersection(const Point & u1, const Point & u2, const Point & v1, const Point & v2) {
    Point ret = u1;
    double t = ((u1.x - v1.x) * (v1.y - v2.y) - (u1.y - v1.y) * (v1.x - v2.x)) / ((u1.x - u2.x) * (v1.y - v2.y) - (u1.y - u2.y) * (v1.x - v2.x));
    ret.x += (u2.x - u1.x) * t;
    ret.y += (u2.y - u1.y) * t;
    return ret;
}
//计算直线与圆的交点, 保证直线与圆有交点
//计算线段与圆的交点可用这个函数后判点是否在线段上
void intersectionLineCircle(const Point & c, double r, const Point & l1, const Point & l2, Point & p1, Point & p2) {
    Point p = c;
    p.x += l1.y - l2.y;
    p.y += l2.x - l1.x;
    p = intersection(p, c, l1, l2);
    double t = sqrt(r * r - dis(p, c) * dis(p, c)) / dis(l1, l2);
    p1.x = p.x + (l2.x - l1.x) * t;
    p1.y = p.y + (l2.y - l1.y) * t;
    p2.x = p.x - (l2.x - l1.x) * t;
    p2.y = p.y - (l2.y - l1.y) * t;
}

//计算圆与圆的交点, 保证圆与圆有交点, 圆心不重合
void intersectionCircleCircle(const Point & c1, double r1, const Point & c2, double r2, Point & p1, Point & p2) {
    Point u, v;
    double t = (1 + (r1 * r1 - r2 * r2) / dis(c1, c2) / dis(c1, c2)) / 2;
    u.x = c1.x + (c2.x - c1.x) * t;
    u.y = c1.y + (c2.y - c1.y) * t;
    v.x = u.x + c1.y - c2.y;
    v.y = u.y - c1.x + c2.x;
    //printf("%lf %lf %lf %lf %lf %lf %lf\n",c1.x,c1.y,r1,u.x,u.y,v.x,v.y);
    intersectionLineCircle(c1, r1, u, v, p1, p2);
}
Point changedir(double x0,double y0,double A){
    Point ret;
    ret.x = x0*cos(A)-y0*sin(A);
    ret.y = x0*sin(A)+y0*cos(A);
    return ret;
}
typedef pair<double,double> PDD;
typedef pair<Point,int> PPI;
bool cmp(PPI A,PPI B){
    if (zero(A.first.x-B.first.x)) return A.first.y<B.first.y;
    return A.first.x<B.first.x;
}
vector<PPI> inter;
vector<PDD> sec[1000];
double ans,rad;
double pi = acos(-1.0);
vector<Point> cir;
Point C[1000];
void out(Point A){
    printf("%lf %lf %lf out point \n",A.x,A.y,A.r);
}
vector<PDD> inv[1000];
double Num[1000];
int t,cnt[1000];
map<double,int> mat;
void do_interval(int N,int now){
	sec[now].clear();
	int i,j,k;
	t = 0;
	for (i=0;i<N;cnt[i++] = 0)

			for (j=0;j<inv[i].size();j++)
				Num[t++] = inv[i][j].first,Num[t++] = inv[i][j].second;
	sort(Num,Num+t);
	t = unique(Num,Num+t)-Num;
	mat.clear();
	for (i=0;i<t;i++)
		mat[Num[i]] = i+1,cnt[i+1] = 0;
	for (i=0;i<N;i++)

				for (j=0;j<inv[i].size();j++)
				{

					int a = mat[inv[i][j].first],b=mat[inv[i][j].second];
					//printf("%lf %lf %d %d---\n",inv[i][j].first,inv[i][j].second,a,b);
					for (k=a;k<b;k++)
						cnt[k]++;
				}
	for (i=1;i<=t;i++)
		if (cnt[i]==N&&!zero(Num[i-1]-Num[i])){
			sec[now].push_back(PDD(Num[i-1],Num[i]));
		}
}
void circle_intersection(int N){
    int i,j;
    for (i=0;i<N;i++){
        double l1 = -pi,l2=-pi,r1=pi,r2=pi;
        Point p1,p2;
        inv[i].clear();
        inv[i].push_back(PDD(-pi,pi));
        for( j=0;j<N;j++)
            if (i!=j){
                //out(cir[i]),out(cir[j]);
                inv[j].clear();
                intersectionCircleCircle(cir[i],cir[i].r,cir[j],cir[j].r,
                    p1,p2);
//printf("%d %d :\n",i,j),out(p1),out(p2);
                double a = atan2(p1.y-cir[i].y,p1.x-cir[i].x);
                double b = atan2(p2.y-cir[i].y,p2.x-cir[i].x);
                if (a<b) swap(a,b),swap(p1,p2);
                Point mid  = changedir(p2.x-cir[i].x,p2.y-cir[i].y,(a-b)/2);
                mid.x+=cir[i].x;
                mid.y+=cir[i].y;
                if (dis(mid,cir[j])+EPS>cir[j].r){
                    //big two
                    //a->b
//printf("a->b\n");
					inv[j].push_back(PDD(a,pi));
					inv[j].push_back(PDD(-pi,b));

                }else {
                		inv[j].push_back(PDD(b,a));

                }
            }
        sec[i].clear();
        do_interval(N,i);

    }
    ans = 0;
    inter.clear();
    for (i=0;i<N;i++)
        if (sec[i].size()>0){
            for (j=0;j<sec[i].size();j++)
            {
                double a = sec[i][j].second;
                double b = sec[i][j].first;
               // if (zero(a-b)) continue;
//printf("%d %d: ----\n",i,j);
                ans+=(a-b)*(cir[i].r+rad);
                Point tmp = changedir(-cir[i].r,0,a+pi);
                tmp.x+=cir[i].x;
                tmp.y+=cir[i].y;
//out(tmp);
                inter.push_back(PPI(tmp,i));
                tmp = changedir(-cir[i].r,0,b+pi);
                tmp.x+=cir[i].x;
                tmp.y+=cir[i].y;
                inter.push_back(PPI(tmp,i));
//out(tmp);
//printf("%d-----\n",i);
            }
        }
    sort(inter.begin(),inter.end(),cmp);

//for (i=0;i<inter.size();i++) printf("%d :",inter[i].second),out(inter[i].first);
    for (i=0;inter.size()>1&&i<inter.size()-1;i++)
    {

        //printf("and here %d %d %d\n",i,inter.size()-1,0<(inter.size()-1));
        Point A = inter[i].first, B = inter[i+1].first;
        //out(A),out(B);

        if (zero(A.x-B.x)&&zero(A.y-B.y)&&inter[i].second!=inter[i+1].second){
            int a = inter[i].second,b = inter[i+1].second;
            Point mid;
            mid.x = (cir[a].x+cir[b].x)/2;
            mid.y = (cir[a].y+cir[b].y)/2;
            double cc = dmult(cir[a],mid,A)/dis(cir[a],A)/dis(mid,A);

            cc = acos(cc);
            double bb = dmult(mid,cir[b],A)/dis(mid,A)/dis(cir[b],A);

            cc+=acos(bb);
           // printf("%lf\n",cc);
            ans+=cc*rad;
        }
    }
}







int main(){
    int N,i,j;
    while(scanf("%d%lf",&N,&rad)){
        if (N==0&&rad==0) break;
        for (i=0;i<N;i++){
            scanf("%lf%lf%lf",&C[i].x,&C[i].y,&C[i].r);
            C[i].r = rad-C[i].r;
        }
        for (i=0;i<N;i++)
            if (C[i].r<0) break;
        if (i<N){
            printf("0.0\n");
            continue;
        }
        cir.clear();
        for (i=0;i<N;i++){
            for (j=i+1;j<N;j++)
                if (dis(C[i],C[j])>=C[i].r+C[j].r)
                    break;
            if (j<N) break;
            for (j=0;j<N;j++)
                if (i!=j&&dis(C[i],C[j])<=C[i].r-C[j].r)
                    break;
            if (j>=N) cir.push_back(C[i]);

        }
        if (i<N){
            printf("0.0\n");
            continue;
        }
        N = cir.size();
        for (i=0;i<N;i++)
            if (cir[i].r==0){
                printf("%.6lf\n",2*pi*cir[i].r);
                break;
            }
        if (i<N) continue;
        circle_intersection(N);
        printf("%.6lf\n",ans);
    }
}









