/*
 * The Computer Language Benchmarks Game
 * http://shootout.alioth.debian.org/
 *
 * contributed by James Durbin
 * slightly modified from Java version from
 * Anthony Donnefort and Razii
 */

import java.io.*

class ReversibleByteArray extends java.io.ByteArrayOutputStream {

    static final byte[] cmp = new byte[128]

    static {
        for (int i = 0; i < cmp.length; i++) cmp[i] = (byte) i

        cmp[(byte)'t'] = cmp[(byte)'T'] = (byte)'A'
        cmp[(byte)'a'] = cmp[(byte)'A'] = (byte)'T'
        cmp[(byte)'g'] = cmp[(byte)'G'] = (byte)'C'
        cmp[(byte)'c'] = cmp[(byte)'C'] = (byte)'G'
        cmp[(byte)'v'] = cmp[(byte)'V'] = (byte)'B'
        cmp[(byte)'h'] = cmp[(byte)'H'] = (byte)'D'
        cmp[(byte)'r'] = cmp[(byte)'R'] = (byte)'Y'
        cmp[(byte)'m'] = cmp[(byte)'M'] = (byte)'K'
        cmp[(byte)'y'] = cmp[(byte)'Y'] = (byte)'R'
        cmp[(byte)'k'] = cmp[(byte)'K'] = (byte)'M'
        cmp[(byte)'b'] = cmp[(byte)'B'] = (byte)'V'
        cmp[(byte)'d'] = cmp[(byte)'D'] = (byte)'H'
        cmp[(byte)'u'] = cmp[(byte)'U'] = (byte)'A'
    }

    void reverse() throws Exception {
        if (count > 0) {
            int begin = 0, end = count - 1
            while (buf[begin++] != '\n')
                while (begin <= end) {
                    if (buf[begin] == '\n') begin++
                    if (buf[end] == '\n') end--
                    if (begin <= end) {
                        byte tmp = buf[begin]
                        buf[begin++] = cmp[buf[end]]
                        buf[end--] = cmp[tmp]
                    }
                }
            System.out.write(buf, 0, count)
        }
    }
}

byte[] line = new byte[82]
int read
ReversibleByteArray buf = new ReversibleByteArray()
while ((read = System.in.read(line)) != -1) {
    int i = 0, last = 0
    while (i < read) {
        if (line[i] == '>') {
            buf.write(line, last, i - last)
            buf.reverse()
            buf.reset()
            last = i
        }
        i++
    }
    buf.write(line, last, read - last)
}
buf.reverse()
