#include <bits/stdc++.h>
using namespace std;

const int MAXN = 100 + 10;

typedef double flt;
const flt eps = 1e-8, PI = M_PI, S = 100.0;

inline flt sqr(flt x) {return x * x;}

struct Point {
    flt x, y;
    Point() {}
    Point(flt a, flt b) : x(a), y(b) {}
    Point operator + (const Point &rhs) const {
        return Point(x + rhs.x, y + rhs.y);
    }
    Point operator - (const Point &rhs) const {
        return Point(x - rhs.x, y - rhs.y);
    }
    Point operator * (const flt k) const {
        return Point(x * k, y * k);
    }
    flt abs() {
        return hypot(x, y);
    }
    flt sqr() {
        return x * x + y * y;
    }
};

Point operator ~(const Point &rhs) {
    return Point(-rhs.y, rhs.x);
}

Point C[MAXN];
flt H[MAXN], R[MAXN], D;
int N, W;

bool ok(Point o) {
    if (o.x < D || o.x > S - D || o.y < D || o.y > S - D) return false;
    for (int i = 0; i < N; ++ i) {
        if ((o - C[i]).abs() + eps < R[i]) return false;
    }
    return true;
}

bool check_line(Point o, flt r, flt a, flt b, flt c) {
    flt dis = a * o.x + b * o.y + c;
    if (fabs(dis) >= r) return false;
    flt u = sqrt(r * r - dis * dis);
    Point v = Point(o.x - a * dis, o.y - b * dis);
    return ok(Point(v.x + b * u, v.y - a * u)) ||
           ok(Point(v.x - b * u, v.y + a * u));
}

bool check() {
    if (ok(Point(D, D)) || ok(Point(D, S - D)) || ok(Point(S - D, D)) || ok(Point(S - D, S - D))) return true;
    for (int i = 0; i < N; ++ i) {
        if (check_line(C[i], R[i], 1, 0, -D)) return true;
        if (check_line(C[i], R[i], 0, 1, -D)) return true;
        if (check_line(C[i], R[i], 1, 0, D - S)) return true;
        if (check_line(C[i], R[i], 0, 1, D - S)) return true;
    }
    for (int i = 0; i < N; ++ i) {
        for (int j = i + 1; j < N; ++ j) {
            flt dis = (C[i] - C[j]).sqr();
            if (dis > sqr(R[i] + R[j]) || dis < sqr(R[i] - R[j])) continue;
            flt w = (1 + (R[i] * R[i] - R[j] * R[j]) / dis) * 0.5;
            flt e = R[i] * R[i] / dis - w * w;
            Point t = (~(C[j] - C[i])) * sqrt(e);
            Point s = C[i] + ((C[j] - C[i]) * w);
            if (ok(s + t) || ok(s - t)) return true;
        }
    }
    return false;
}

int main() {
    while (scanf("%d%d", &N, &W) == 2 && (N || W)) {
        for (int i = 0; i < N; ++ i) scanf("%lf%lf%lf", &C[i].x, &C[i].y, &H[i]);
        flt left = 0, right = 200;
        for (int _ = 0; _ < 50; ++ _) {
            double mid = (left + right) * 0.5;
            D = W > mid ? mid : sqrt(2 * W * mid - W * W);
            for (int i = 0; i < N; ++ i) {
                R[i] = H[i] > mid ? mid : sqrt(2 * H[i] * mid - H[i] * H[i]);
            }
            if (check()) left = mid;
            else right = mid;
        }
        printf("%.10f\n", left);
    }
}
