Problem: Let s(x) be sum of digits in decimal representation of positive integer x. Given two integers n and m, find some positive integers a and b such that 

  * s(a) ≥ n, 
  * s(b) ≥ n, 
  * s(a + b) ≤ m. 

Input

The only line of input contain two integers n and m (1 ≤ n, m ≤ 1129).

Output

Print two lines, one for decimal representation of a and one for decimal representation of b. Both numbers must not contain leading zeros and must have length no more than 2230.

Examples

Input

6 5


Output

6 
7


Input

8 16


Output

35 
53

Note

In the first sample, we have n = 6 and m = 5. One valid solution is a = 6, b = 7. Indeed, we have s(a) = 6 ≥ n and s(b) = 7 ≥ n, and also s(a + b) = s(13) = 4 ≤ m.

Solution (in CPP):

Solution:
#include <bits/stdc++.h>
using namespace std;
auto start = std::chrono::system_clock::now();
inline void skj() {
  std::chrono::time_point<std::chrono::system_clock> end;
  end = std::chrono::system_clock::now();
  std::chrono::duration<double> elapsed_seconds = end - start;
  std::time_t end_time = std::chrono::system_clock::to_time_t(end);
  cerr << "Time taken " << elapsed_seconds.count() * 1000 << "\n";
}
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
struct custom_hash {
  static uint64_t splitmix64(uint64_t x) {
    x += 0x9e3779b97f4a7c15;
    x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9;
    x = (x ^ (x >> 27)) * 0x94d049bb133111eb;
    return x ^ (x >> 31);
  }
  size_t operator()(uint64_t x) const {
    static const uint64_t FIXED_RANDOM =
        chrono::steady_clock::now().time_since_epoch().count();
    return splitmix64(x + FIXED_RANDOM);
  }
};
inline long long binexp(long long a, long long b, long long m) {
  if (a == 0) {
    return 0;
  }
  long long res = 1;
  a %= m;
  while (b) {
    if (b & 1) res = (res * 1ll * a) % m;
    a = (a * 1ll * a) % m;
    b >>= 1;
  }
  return res;
}
inline long long binmul(long long a, long long b, long long m) {
  a %= m;
  long long res = 0;
  while (b) {
    if (b & 1) {
      res = (res + a) % m;
    }
    a = (a + a) % m;
    b >>= 1;
  }
  return res;
}
const long long N = 3e5 + 5;
long long seg[4 * N], lazy[4 * N];
void updateRange(long long node, long long start, long long end, long long l,
                 long long r, long long val) {
  if (lazy[node] != 0) {
    seg[node] += lazy[node];
    if (start != end) {
      lazy[node * 2] += lazy[node];
      lazy[node * 2 + 1] += lazy[node];
    }
    lazy[node] = 0;
  }
  if (start > end or start > r or end < l) return;
  if (start >= l and end <= r) {
    seg[node] += val;
    if (start != end) {
      lazy[node * 2] += val;
      lazy[node * 2 + 1] += val;
    }
    return;
  }
  long long mid = (start + end) / 2;
  updateRange(node * 2, start, mid, l, r, val);
  updateRange(node * 2 + 1, mid + 1, end, l, r, val);
  seg[node] = min(seg[node * 2], seg[node * 2 + 1]);
}
long long queryRange(long long node, long long start, long long end,
                     long long l, long long r) {
  if (start > end or start > r or end < l) return 0;
  if (lazy[node] != 0) {
    seg[node] += lazy[node];
    if (start != end) {
      lazy[node * 2] += lazy[node];
      lazy[node * 2 + 1] += lazy[node];
    }
    lazy[node] = 0;
  }
  if (start >= l and end <= r) return seg[node];
  long long mid = (start + end) / 2;
  long long p1 = queryRange(node * 2, start, mid, l, r);
  long long p2 = queryRange(node * 2 + 1, mid + 1, end, l, r);
  return min(p1, p2);
}
inline void solve_me_senpai() {
  long long n, m;
  cin >> n >> m;
  long long a = 5, b = 4;
  string as = "5", bs = "5";
  while (a <= n or b <= n) {
    a += 5, b += 4;
    as.push_back('5');
    bs.push_back('4');
  }
  reverse(as.begin(), as.end());
  reverse(bs.begin(), bs.end());
  cout << as << " " << bs << "\n";
}
int32_t main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  long long t = 1;
  long long a = 1;
  while (t--) {
    solve_me_senpai();
    a++;
  }
  return 0;
}