#include <bits/stdc++.h>
using namespace std;
template <typename T>
string to_string(const vector<T>& vc, int w) {
  if (vc.empty()) return "";
  if (w + 1 == vc.size()) return to_string(vc[w]);
  return to_string(vc[w]) + "," + to_string(vc, w + 1);
}
template <typename T>
string to_string(const vector<T>& vc) {
  return "{" + to_string(vc, 0) + "}";
}
void debug_out() { cerr << endl; }
template <typename Head, typename... Tail>
void debug_out(Head H, Tail... T) {
  cerr << " " << to_string(H);
  debug_out(T...);
}
class DebugStream {
} LOG;
template <typename T>
DebugStream& operator<<(DebugStream& s, const T&) {
  return s;
}
mt19937 rnd(chrono::steady_clock::now().time_since_epoch().count());
const int maxN = 1e5 + 9, maxV = 1e6 + 9, MOD = 1e9 + 7, SQ = 335, lg = 20,
          bs = 29;
vector<long long> proc(vector<long long> ini, vector<long long> fin) {
  assert(ini.size() == 2 && fin.size() == 2);
  vector<long long> ops;
  auto srt = ini;
  auto rev = ini;
  reverse(rev.begin(), rev.end());
  sort(srt.begin(), srt.end());
  int ptr = 0;
  if (fin[0] == srt[0] || fin[1] == srt[0]) ptr++;
  while (ini != fin) {
    42;
    if (rev == fin) {
      ops.push_back(0);
      break;
    }
    if (fin[0] > fin[1]) ops.push_back(0), swap(fin[0], fin[1]);
    if (ptr == 2) return vector<long long>({LLONG_MAX / 3});
    long long imn = srt[ptr];
    long long divi = fin[0];
    if (imn < fin[1] % divi) {
      ops.push_back(fin[1] / divi);
      fin[1] %= divi;
    } else if (imn % divi == fin[1] % divi) {
      ops.push_back((fin[1] - imn) / divi);
      fin[1] = imn;
      ptr++;
    } else
      return vector<long long>({LLONG_MAX / 3});
  }
  return ops;
}
void solve2(vector<long long> arr, vector<long long> brr) {
  assert(arr.size() == 2 && brr.size() == 2);
  auto gud = proc(arr, brr);
  auto suma = accumulate(gud.begin(), gud.end(), 0LL);
  if (suma >= LLONG_MAX / 3) {
    cout << "IMPOSSIBLE\n";
    return;
  }
  if (suma > 200000) {
    cout << "BIG\n" << suma << '\n';
    return;
  }
  reverse(gud.begin(), gud.end());
  string ans = "";
  for (auto el : gud) {
    if (el == 0)
      ans += 'R';
    else
      while (el--) ans += 'P';
  }
  cout << "SMALL\n" << ans.size() << '\n' << ans << '\n';
}
long long minim(const vector<long long>& vc) {
  return *min_element(vc.begin(), vc.end());
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  int n;
  cin >> n;
  vector<long long> arr(n), brr(n);
  for (auto& el : arr) cin >> el;
  for (auto& el : brr) cin >> el;
  if (n == 1) {
    if (arr[0] == brr[0])
      cout << "SMALL\n0\n";
    else
      cout << "IMPOSSIBLE\n";
    return 0;
  }
  if (n == 2) {
    solve2(arr, brr);
    return 0;
  }
  auto rvv = arr;
  reverse(rvv.begin(), rvv.end());
  string ops = "";
  int u = 0;
  while (minim(brr) > 0 && brr != arr && brr != rvv) {
    if (brr[0] > brr.back()) ops += 'R', reverse(brr.begin(), brr.end());
    ops += 'P';
    for (int i = n - 1; i > 0; i--) brr[i] -= brr[i - 1];
  }
  if (minim(brr) <= 0) {
    cout << "IMPOSSIBLE\n";
    return 0;
  }
  if (brr != arr) {
    assert(brr == rvv);
    ops += 'R';
  }
  reverse(ops.begin(), ops.end());
  if (ops.size() > 200000)
    cout << "BIG\n" << count(ops.begin(), ops.end(), 'P') << '\n';
  else
    cout << "SMALL\n" << ops.size() << '\n' << ops << '\n';
}
