#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <numeric>
#include <utility>
#include <tuple>

#define REP(i, a, b) for (int i = int(a); i < int(b); i++)
using namespace std;
using ll = long long int;
using P = pair<ll, ll>;

// clang-format off
#ifdef _DEBUG_
#define dump(...) do{ cerr << __LINE__ << ":\t" << #__VA_ARGS__ << " = "; PPPPP(__VA_ARGS__); cerr << endl; } while(false)
template<typename T> void PPPPP(T t) { cerr << t; }
template<typename T, typename... S> void PPPPP(T t, S... s) { cerr << t << ", "; PPPPP(s...); }
#else
#define dump(...) do{ } while(false)
#endif
template<typename T> vector<T> make_v(size_t a, T b) { return vector<T>(a, b); }
template<typename... Ts> auto make_v(size_t a, Ts... ts) { return vector<decltype(make_v(ts...))>(a, make_v(ts...)); }
template<typename T> bool chmin(T &a, T b) { if (a > b) {a = b; return true; } return false; }
template<typename T> bool chmax(T &a, T b) { if (a < b) {a = b; return true; } return false; }
template<typename T> void print(T a) { cout << a << endl; }
template<typename T, typename... Ts> void print(T a, Ts... ts) { cout << a << ' '; print(ts...); }
template<typename T> istream &operator,(istream &in, T &t) { return in >> t; }
// clang-format on

int main() {
    cin.tie(nullptr);
    ios::sync_with_stdio(false);
    int a, b;
    cin, a, b;
    print((a + b) / 2, (a - b) / 2);
    return 0;
}

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main()
{
    int N;
    long long int K;
    cin >> N >> K;

    // div2[i]: i = n1 + n2 の組合わせ数 ( 1<= n1, n2 <= N)
    vector<int> div2(2*N+1 , 0);      
    for (int i = 2; i <= (N + 1); ++i) { div2[i] = i - 1; }
    for (int i = (N + 2); i <= (2 * N); ++i) { div2[i] = 2 * N - i + 1; }

    // int_div2[i] = div2[0] + .. + div2[i]
    vector<long long int> int_div2(2 * N + 1, 0);    
    for (int i = 1; i <= 2*N; ++i) { int_div2[i] = int_div2[i - 1] + static_cast<long long int>(div2[i]); }

    // 合計値の探索
    int sum = 0;
    long long int rank = 0;
    long long int pri_rank = 0;
    for (sum = 3; sum <= (3 * N); ++sum)
    {
        // 2 <= j - i <= 2N and 1 <= j <= N
        int b = max(2, sum - N);
        int e = min(sum - 1, 2 * N);
        long long int div3 = int_div2[e] - int_div2[b-1];     // = div3[i]: i = n1 + n2 + n3 の組合わせ数 ( 1<= n1, n2, n3 <= N)
        if (div3 >= K) { break; }
        else { K -= div3; }
    }

    int first_i = max(1, sum - 2 * N);
    int last_i = min(N, sum - 2);
    int k = 0;
    for (k = first_i; k <= last_i; ++k)
    {
        if (K <= div2[sum - k]) { break; }
        else { K -= div2[sum - k]; }
    }

    int first_o = max(1, sum - k - N);
    int o = first_o + static_cast<int>(K) - 1;
    int n = sum - k -o;

    cout << k << " " << o << " " << n << endl;

    return 0;
}
