#include <bits/stdc++.h>
#include <cmath>
using namespace std;
const double eps = 1e-6;
const int N = 1e5 + 9;
double a[N][3], n, S; 


//最短半径(下标)越大,得到的权值和(值)越大(单调递增)
//已知最短半径可以在O(n)时间算出覆盖的权值和
//找出分界点(即在权值和至少为S时最短半径)

//示例(以整数为例)
//半径     1  2  3  4
//权值和   0  1  1  2
//如果S为1时,半径最短为2,也就是找到第一个值>=1的位置下标(左边界二分)

//根据下标得到值(由半径得到权值和)
double check(double mid){
    double res = 0;
    for(int i = 0; i < n; ++i){
        double dist = a[i][0] * a[i][0] + a[i][1] * a[i][1];
        if(dist <= mid * mid){
            res += a[i][2];
        }
    }
    return res;
}


//二分答案(求什么分什么),分实数半径r
int main() {
    cin >> n >> S;
    for(int i = 0; i < n; ++i){
        for(int j = 0; j < 3; ++j){
            cin >> a[i][j];
        }
    }

    //二分最短半径
    double l = 0, r = 1e10; //根据x,y取值,半径r最大不超过根号2*1e9 < 1e10
    while(r - l >= eps){
        double mid = l + (r - l) / 2;
        if(check(mid) >= S) r = mid;
        else l = mid;
    }
    cout << setprecision(10) << (check(r) >= S ? r : -1) << endl;
}