#include <bits/stdc++.h>
using namespace std;
#define rep(i, a) for (int i = 0; i < (int)(a); i++)
#define sz(x) (int)(x).size()
#define pcnt __builtin_popcountll
typedef long long ll;
template<typename T>istream& operator>>(istream&i,vector<T>&v){rep(j,sz(v))i>>v[j];return i;}
template<typename T>string join(const vector<T>&v){stringstream s;rep(i,sz(v))s<<' '<<v[i];return s.str().substr(1);}
template<typename T>ostream& operator<<(ostream&o,const vector<T>&v){if(sz(v))o<<join(v);return o;}
template<typename T1,typename T2>istream& operator>>(istream&i,pair<T1,T2>&v){return i>>v.first>>v.second;}
template<typename T1,typename T2>ostream& operator<<(ostream&o,const pair<T1,T2>&v){return o<<v.first<<","<<v.second;}
template<typename T>bool mins(T& x,const T&y){if(x>y){x=y;return true;}else return false;}
template<typename T>bool maxs(T& x,const T&y){if(x<y){x=y;return true;}else return false;}
template<typename T>T dup(T x, T y){return (x+y-1)/y;}
template<typename T>ll suma(const vector<T>&a){ll res(0);for(auto&&x:a)res+=x;return res;}
int keta(ll n) { int ret = 0; while (n>0) { n/=10; ret++; } return ret; }

#ifdef _DEBUG
inline void dump() { cerr << endl; }
template <typename Head> void dump(Head &&head) { cerr << head; dump(); }
template <typename Head, typename... Tail> void dump(Head &&head, Tail &&... tail) { cerr << head << ", "; dump(forward<Tail>(tail)...); }
#define debug(...) do { cerr << __LINE__ << ":\t" << #__VA_ARGS__ << " = "; dump(__VA_ARGS__); } while (false)
#else
#define dump(...)
#define debug(...)
#endif

template <typename T> struct edge {
  int src, to;
  T cost;
  edge(int to, T cost) : src(-1), to(to), cost(cost) {}
  edge(int src, int to, T cost) : src(src), to(to), cost(cost) {}
  edge &operator=(const int &x) {
    to = x;
    return *this;
  }
  operator int() const { return to; }
};
template <typename T> using Edges = vector<edge<T>>;
template <typename T> using WeightedGraph = vector<Edges<T>>;
using UnWeightedGraph = vector<vector<int>>;

const ll LINF = 1LL << 60;
const int INF = 1001001001;

/////////////////////////////////////////////////////////////////////

void solve()
{
  ll n,k; cin>>n>>k;
  vector<vector<ll>> dp(3, vector<ll>(n*3+1));
  for (int i=1; i<=n; i++) {
    dp[0][i] = 1;
  }

  rep(i, 2) {
    vector<ll> s = dp[i];
    rep(j, 3*n) {
      s[j+1] += s[j];
      dp[i+1][j+1] = s[j] - s[max(0LL, j-n)];
    }
  }

  vector<ll> s = dp[2];
  rep(i, 3*n) s[i+1] += s[i];

  auto it = lower_bound(s.begin(), s.end(), k);
  ll v = it - s.begin();
  ll u = k - s[v-1] - 1;

  ll a = 1;
  ll cnt = 0;
  for (ll i=1; i<=min(v, n); i++) {
    a = i;
    ll t = v - i;
    if (t < 2 || 2*n < t) continue;
    ll g = min(2*n-t+1, t-1);
    if (cnt + g > u) break;
    cnt += g;
  }
  v -= a;
  u -= cnt;
  for (ll i=1; i<=n; i++) {
    ll t = v - i;
    if (t < 1 || n < t) continue;
    if (u <= 0) {
      printf("%lld %lld %lld\n", a, i, t);
      break;
    }
    u--;
  }

}

int main()
{
  int t;
  t = 1;
  // cin>>t;
  while (t--) solve();

  return 0;
}

#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
int main()
{
  int a[1001], b[1001], c[2001], p, k, j, n, m, i;
  cin >> n >> m;
  for (i = 0; i < n; i++)
    cin >> a[i];
  for (i = 0; i < m; i++)
    cin >> b[i];
  p = 0;
  for (i = 0; i < n; i++)
  {
      k = 0;
      for(j = 0; j < m; j++)
        if(a[i] == b[j])
            k++;
      if (k==0)
      {
          c[p] = a[i];
          p++;
      }
  }
  for (i = 0; i < m; i++)
  {
      k = 0;
      for(j =0; j< n; j++)
        if(b[i] == a[j])
            k++;
      if (k==0)
      {
          c[p] = b[i];
          p++;
      }
  }
  sort(c, c + p);
  for (i = 0; i < p; i++)
    cout << c[i] << " ";
  return 0;
}
