- リスト内包表記
 - 逆順リスト
 - key(ソート基準)を指定したソート
 
N = int(raw_input())
wd = [raw_input() for line in range(N)]
wd = sorted(wd, key = lambda x : x[::-1])
for w in wd:
    print w
N = int(raw_input())
wd = [raw_input() for line in range(N)]
wd = sorted(wd, key = lambda x : x[::-1])
for w in wd:
    print w
def f(x):
    if x == 'F':
        return 0
    return 4-ord(x)+ord('A')
 
N = int(raw_input())
str = raw_input()
p = map(lambda x : f(x), str)
p = 1.0 * reduce(lambda a, b : a+b, p) / N
print p
#define REP(i, n) for(int i=0; i<(int)(n); i++)
#define FOR(i, s, e) for (int i = (int)(s); i < (int)(e); i++)
class BlurredDartboard {
public:
    int minThrows(vector<int> points, int P) {
        int ret = 1<<30;
        int N = points.size();
        // use the highest point visible
        int maxv = *max_element(points.begin(), points.end());
        if (maxv)
            ret = (P+maxv-1)/maxv;
        // use invisible points
        bool visible[64] = {0};
        REP(i, N)
            if (points[i])
                visible[points[i]] = 1;
        vector<int> unvisible;
        FOR (i, 1, N+1)
            if (!visible[i])
                unvisible.push_back(i);
        int sum = accumulate(unvisible.begin(), unvisible.end(), 0);
        int m = unvisible.size();
        if (sum) {
            int x = P/sum*m;
            P %= sum;
            // use the highest point for the points remained
            if (maxv)
                ret = min(ret, x+(P+maxv-1)/maxv);
            // use invisible points for the points remained
            int cnt = 0;
            while (P > 0)
                P -= unvisible[cnt++];
            ret = min(ret, x + cnt);
        }
        return ret;
    }
};
using namespace std;
#define REP(i, n) for(int i=0; i<(int)(n); i++)
#define FOR(i, s, e) for (int i = (int)(s); i < (int)(e); i++)
int N;
long long x[500];
void printNums(unsigned long long use) {
    bool fst = true;
    REP (i, N) {
        if (use & 1LL << i) {
            if (fst)
                fst = false;
            else
                cout << " ";
            cout << x[i];
        }
    }
    cout << endl;
}
void solve() {
    unsigned long long use = 0;
    boost::unordered_map<long long, unsigned long long> vis;
    N = min(N, 50);
    unsigned long long use2 = 0;
    for (;;) {
        use = use * 23 + 17542197;
        long long sum = 0;
        REP(i, N) if (use & 1LL<<i) sum += x[i];
        if (sum && vis.count(sum)) {
            use2 = vis[sum];
            break;
        }
        vis[sum] = use;
    }
    printNums(use);
    printNums(use2);
}
#define SUBMIT
int main() {
#ifdef SUBMIT
    freopen("./test.in", "r", stdin);
    freopen("./test.out", "w", stdout);
#endif
    int T;
    cin >> T;
    REP(t, T) {
        cout << "Case #" << t+1 << ":" << endl;
        cerr << "Case #" << t+1 << ":" << endl;
        cin >> N;
        REP(i, N) cin >> x[i];
        solve();
    }
#ifdef SUBMIT
    fflush(stdout);
    cerr << "all done!" << endl;
#endif
    return 0;
}
#define REP(i, n) for(int i=0; i<(int)(n); i++)
#define FOR(i, s, e) for (int i = (int)(s); i < (int)(e); i++)
typedef pair<double, pair<int, int> > Pr;
const int dx[] = {-1, 0, 1, 0};
const int dy[] = {0, 1, 0, -1};
const double INF = 1e100;
const double EPS = 1e-4;
int H, N, M;
int clg[128][128];
int flr[128][128];
double dist[128][128];
double enterTime(int x1, int y1, int x2, int y2) {
    if (flr[x1][y1] > clg[x2][y2]-50)
        return INF;
    if (flr[x2][y2] > clg[x2][y2]-50)
        return INF;
    if (flr[x2][y2] > clg[x1][y1]-50)
        return INF;
    if (H <= clg[x2][y2]-50)
        return 0;
    return (H - (clg[x2][y2]-50)) / 10.0;
}
double solve() {
    REP(i, N) REP(j, M) dist[i][j] = INF;
    priority_queue<Pr, vector<Pr>, greater<Pr> > Q;
    Q.push(make_pair(0, make_pair(0, 0)));
    dist[0][0] = 0;
    while (!Q.empty()) {
        double t = Q.top().first;
        int x = Q.top().second.first;
        int y = Q.top().second.second;
        Q.pop();
        if (t > dist[x][y])
            continue;
        if (x == N-1 && y == M-1)
            break;
        REP(k, 4) {
            int xx = x + dx[k];
            int yy = y + dy[k];
            if (xx < 0 || xx > N-1 || yy < 0 || yy > M-1)
                continue;
            double u = max(t, enterTime(x, y, xx, yy));
            if (u == 0.0)
                ;
            else if (H-10*u-flr[x][y] + EPS >= 20)
                u += 1.0;
            else
                u += 10.0;
            if (u < dist[xx][yy]) {
                dist[xx][yy] = u;
                Q.push(make_pair(u, make_pair(xx, yy)));
            }
        }
    }
    return dist[N-1][M-1];
}
#define SUBMIT
int main() {
#ifdef SUBMIT
    freopen("./test.in", "r", stdin);
    freopen("./test.out", "w", stdout);
#endif
    int T;
    cin >> T;
    REP(t, T) {
        cerr << "solving #" << t+1 << "..." << endl;
        cin >> H >> N >> M;
        REP(i, N) REP(j, M) cin >> clg[i][j];
        REP(i, N) REP(j, M) cin >> flr[i][j];
        double ret = solve();
        printf("Case #%d: %.16lf\n", t+1,ret);
    }
#ifdef SUBMIT
    fflush(stdout);
    cerr << "all done!" << endl;
#endif
    return 0;
}
bool isEvenPermutation(vector<int> v) {
    int exchange = 0;
    for (int i = 0; i < (int)v.size(); i++) {
        if (v[i] == i)
            continue;
        ++exchange;
        for (int j = i+1; j < (int)v.size(); j++) {
            if (v[j] == i) {
                swap(v[i], v[j]);
                break;
            }
        }
    }
    return exchange % 2 == 0;
}
int orbitCount(vector<int> v) {
    int cnt = 0;
    for (int i = 0; i < (int)v.size(); i++) {
        if (v[i] == -1)
            continue;
        ++cnt;
        int j = i;
        while (v[j] != -1) {
            int tmp = v[j];
            v[j] = -1;
            j = tmp;
        }
    }
    return cnt;
}
long long power(long long x, long long y) {
    long long ret = 1;
    for (int i = 0; i < y; i++)
        ret *= x;
    return ret;
}
int main() {
    long long color;
    cin >> color;
    vector<int> v;
    for (int i = 0; i < 4; i++)
        v.push_back(i);
    int g = 0;
    long long pattern = 0;
    do {
        if (isEvenPermutation(v)) {
            ++g;
            pattern += power(color, orbitCount(v));
        }
    } while (next_permutation(v.begin(), v.end()));
    assert(g > 0);
    assert(pattern % g == 0);
    cout << "Pattern: " << pattern/g << endl;
}