#include <bits/stdc++.h>
using namespace std;
struct node {
  int st;
  long long mypt, yrpt;
  node() : st(-1), mypt(-1), yrpt(-1) {}
  node(int st, long long mypt, long long yrpt)
      : st(st), mypt(mypt), yrpt(yrpt) {}
  bool operator<(const node &S) const {
    if (st != S.st) return st < S.st;
    if (mypt != S.mypt) return mypt < S.mypt;
    return yrpt > S.yrpt;
  }
};
map<string, long long> score;
map<string, int> cnt;
map<string, node> DP[2];
node f(string s, int p) {
  if (DP[p].find(s) != DP[p].end()) return DP[p][s];
  node res = node(0, -1, 1LL << 60);
  bool isleaf = 1;
  for (int i = (0); i < (26); ++i) {
    string t = s + char(i + 'a');
    if (score.find(t) != score.end()) {
      node opp = f(t, !p);
      opp.st = !opp.st;
      swap(opp.yrpt, opp.mypt);
      opp.mypt += score[t];
      res = max(res, opp);
      isleaf = 0;
    }
    t = char(i + 'a') + s;
    if (score.find(t) != score.end()) {
      node opp = f(t, !p);
      opp.st = !opp.st;
      swap(opp.yrpt, opp.mypt);
      opp.mypt += score[t];
      res = max(res, opp);
      isleaf = 0;
    }
  }
  if (isleaf) res = node(0, 0, 0);
  return DP[p][s] = res;
}
int main(int argc, char **argv) {
  int N;
  cin >> N;
  for (int i = (0); i < (N); ++i) {
    string s;
    cin >> s;
    int L = s.length();
    map<string, bool> seen;
    for (int j = (0); j < (L); ++j) {
      string t;
      long long sum = 0, maxv = 0;
      for (int k = (j); k < (L); ++k) {
        t = t + s[k];
        sum = sum + s[k] - 'a' + 1;
        maxv = max(maxv, (long long)(s[k] - 'a' + 1));
        score[t] = sum * maxv;
        if (seen.find(t) == seen.end()) {
          seen[t] = 1;
          cnt[t]++;
        }
      }
    }
  }
  for (map<string, int>::iterator i = cnt.begin(); i != cnt.end(); i++)
    score[i->first] += i->second;
  node res = f("", 0);
  puts(res.st ? "First" : "Second");
  cout << res.mypt << " " << res.yrpt;
  return 0;
}
