#include <bits/stdc++.h>
#pragma GCC optimize("O3")
using namespace std;
template <class c>
struct rge {
  c b, e;
};
template <class c>
rge<c> range(c i, c j) {
  return rge<c>{i, j};
}
template <class c>
auto dud(c* x) -> decltype(cerr << *x, 0);
template <class c>
char dud(...);
struct debug {
  template <class c>
  debug& operator<<(const c&) {
    return *this;
  }
};
const long long MOD = 1e9 + 7;
const long long N = 1e7 + 10;
const long long INF = 1e18 + 10;
bool isPre(string a, string b) {
  int n = (int)a.size();
  int m = (int)b.size();
  if (n > m) return false;
  int i, j;
  for (i = 0, j = 0; i < m && j < n; i++, j++) {
    if (a[i] != b[j]) break;
  }
  if (j == n) return true;
  return false;
}
bool isSuf(string a, string b) {
  int n = (int)a.size();
  int m = (int)b.size();
  if (n > m) return false;
  int i, j;
  for (i = n - 1, j = m - 1; i >= 0 && j >= 0; i--, j--) {
    if (a[i] != b[j]) break;
  }
  if (i == -1) return true;
  return false;
}
bool comp(string a, string b) { return a.size() < b.size(); }
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  int n;
  cin >> n;
  int t = 2 * n - 2;
  vector<string> v[n];
  vector<string> sub(t);
  for (int i = 0; i < t; i++) {
    string x;
    cin >> x;
    sub[i] = x;
    v[(int)x.size()].push_back(x);
  }
  auto check = [&](string x) {
    set<string> s;
    for (int i = 0; i < t; i++) {
      if (isPre(sub[i], x)) {
        s.insert(sub[i]);
      } else if (not isSuf(sub[i], x))
        return false;
    }
    if ((int)s.size() == (2 * n - 2) / 2) return true;
    return false;
  };
  string str = v[n - 1][0] + v[1][0];
  set<string> s;
  debug() << " ["
          << "str"
             ": "
          << (str) << "] ";
  if (check(str)) {
    debug() << " ["
            << "str"
               ": "
            << (str) << "] ";
    for (int i = 0; i < t; i++) {
      if (isPre(sub[i], str) && s.find(sub[i]) == s.end()) {
        s.insert(sub[i]);
        cout << 'P';
      } else
        cout << 'S';
    }
    cout << endl;
    return 0;
  }
  s.clear();
  str = v[n - 1][0] + v[1][1];
  debug() << " ["
          << "str"
             ": "
          << (str) << "] ";
  if (check(str)) {
    debug() << " ["
            << "str"
               ": "
            << (str) << "] ";
    for (int i = 0; i < t; i++) {
      if (isPre(sub[i], str) && s.find(sub[i]) == s.end()) {
        s.insert(sub[i]);
        cout << 'P';
      } else
        cout << 'S';
    }
    cout << endl;
    return 0;
  }
  s.clear();
  str = v[n - 1][1] + v[1][0];
  debug() << " ["
          << "str"
             ": "
          << (str) << "] ";
  if (check(str)) {
    debug() << " ["
            << "str"
               ": "
            << (str) << "] ";
    for (int i = 0; i < t; i++) {
      if (isPre(sub[i], str) && s.find(sub[i]) == s.end()) {
        s.insert(sub[i]);
        cout << 'P';
      } else
        cout << 'S';
    }
    cout << endl;
    return 0;
  }
  s.clear();
  str = v[n - 1][1] + v[1][1];
  debug() << " ["
          << "str"
             ": "
          << (str) << "] ";
  if (check(str)) {
    debug() << " ["
            << "str"
               ": "
            << (str) << "] ";
    for (int i = 0; i < t; i++) {
      if (isPre(sub[i], str) && s.find(sub[i]) == s.end()) {
        s.insert(sub[i]);
        cout << 'P';
      } else
        cout << 'S';
    }
    cout << endl;
    return 0;
  }
  return 0;
}
