#include <bits/stdc++.h>
using namespace std;
const double EPS = 1e-8;
int sign(double x) { return x < -EPS ? -1 : x > EPS; }
struct Node {
  double m, v, x;
  void Swap(Node &node) {
    double m1 = m, m2 = node.m;
    double v1 = v, v2 = node.v;
    double v11, v22;
    v11 = v1, v22 = v2;
    v1 = ((m1 - m2) * v11 + 2.0 * m2 * v22) / (m1 + m2);
    v2 = ((m2 - m1) * v22 + 2.0 * m1 * v11) / (m1 + m2);
    v = v1;
    node.v = v2;
  }
  void Move(double t) { x = x + v * t; }
  void get() { cin >> x >> v >> m; }
  void out() { printf("%.10f\n", x); }
} B[11];
int n;
double T;
pair<double, vector<pair<int, int> > > next_clo_time() {
  double best = 1e20;
  pair<int, int> P = make_pair(-1, -1);
  vector<pair<int, int> > pp;
  int i, j;
  for (i = 0; i < n; ++i)
    for (j = 0; j < n; ++j)
      if (i != j) {
        Node X, Y;
        X = B[i];
        Y = B[j];
        if (X.x > Y.x) continue;
        int f0 = sign(X.v);
        int f1 = sign(Y.v);
        if (f0 > 0 && f1 > 0) {
          if (sign(X.v - Y.v) <= 0) continue;
          double t0 = (Y.x - X.x) / (X.v - Y.v);
          if (fabs(t0) > EPS) {
            if (t0 < best) {
              best = t0;
              P = make_pair(i, j);
            }
          }
          continue;
        }
        if (f0 < 0 && f1 < 0) {
          if (sign(fabs(Y.v) - fabs(X.v)) <= 0) continue;
          double t0 = (Y.x - X.x) / (fabs(Y.v) - fabs(X.v));
          if (fabs(t0) > EPS) {
            if (t0 < best) {
              best = t0;
              P = make_pair(i, j);
            }
          }
          continue;
        }
        if (f0 < 0 && f1 > 0) continue;
        if (f0 > 0 && f1 < 0) {
          double t0 = (Y.x - X.x) / (fabs(X.v) + fabs(Y.v));
          if (fabs(t0) > EPS) {
            if (t0 < best) {
              best = t0;
              P = make_pair(i, j);
            }
          }
          continue;
        }
      }
  if (best > 1e10) return make_pair(best, pp);
  for (i = 0; i < n; ++i)
    for (j = 0; j < n; ++j)
      if (i != j) {
        Node X, Y;
        X = B[i];
        Y = B[j];
        if (X.x > Y.x) continue;
        int f0 = sign(X.v);
        int f1 = sign(Y.v);
        if (f0 > 0 && f1 > 0) {
          if (sign(X.v - Y.v) <= 0) continue;
          double t0 = (Y.x - X.x) / (X.v - Y.v);
          if (fabs(t0 - best) < EPS) {
            pp.push_back(make_pair(i, j));
          }
          continue;
        }
        if (f0 < 0 && f1 < 0) {
          if (sign(fabs(Y.v) - fabs(X.v)) <= 0) continue;
          double t0 = (Y.x - X.x) / (fabs(Y.v) - fabs(X.v));
          if (fabs(t0 - best) < EPS) {
            pp.push_back(make_pair(i, j));
          }
          continue;
        }
        if (f0 < 0 && f1 > 0) continue;
        if (f0 > 0 && f1 < 0) {
          double t0 = (Y.x - X.x) / (fabs(X.v) + fabs(Y.v));
          if (fabs(t0 - best) < EPS) {
            pp.push_back(make_pair(i, j));
          }
          continue;
        }
      }
  return make_pair(best, pp);
}
void gao() {
  int i;
  for (i = 0; i < n; ++i) B[i].get();
  while (fabs(T) > EPS) {
    pair<double, vector<pair<int, int> > > ret = next_clo_time();
    double tneed = ret.first;
    if (tneed > 1e10) {
      for (i = 0; i < n; ++i) B[i].Move(T);
      break;
    }
    if (sign(tneed - T) >= 0) {
      for (i = 0; i < n; ++i) B[i].Move(T);
      break;
    }
    T -= tneed;
    for (i = 0; i < n; ++i) B[i].Move(tneed);
    for (i = 0; i < ret.second.size(); ++i)
      B[ret.second[i].first].Swap(B[ret.second[i].second]);
  }
  for (i = 0; i < n; ++i) B[i].out();
}
int main() {
  while (cin >> n >> T) gao();
  return 0;
}
