So, the New Year holidays are over. Santa Claus and his colleagues can take a rest and have guests at last. When two "New Year and Christmas Men" meet, thear assistants cut out of cardboard the letters from the guest's name and the host's name in honor of this event. Then the hung the letters above the main entrance. One night, when everyone went to bed, someone took all the letters of our characters' names. Then he may have shuffled the letters and put them in one pile in front of the door.The next morning it was impossible to find the culprit who had made the disorder. But everybody wondered whether it is possible to restore the names of the host and his guests from the letters lying at the door? That is, we need to verify that there are no extra letters, and that nobody will need to cut more letters.Help the "New Year and Christmas Men" and their friends to cope with this problem. You are given both inscriptions that hung over the front door the previous night, and a pile of letters that were found at the front door next morning.

The input file consists of three lines: the first line contains the guest's name, the second line contains the name of the residence host and the third line contains letters in a pile that were found at the door in the morning. All lines are not empty and contain only uppercase Latin letters. The length of each line does not exceed 100.

Print "YES" without the quotes, if the letters in the pile could be permuted to make the names of the "New Year and Christmas Men". Otherwise, print "NO" without the quotes.

NoteIn the first sample the letters written in the last line can be used to write the names and there won't be any extra letters left.In the second sample letter "P" is missing from the pile and there's an extra letter "L".In the third sample there's an extra letter "L".

import java.io.BufferedReader
import java.io.IOException
import java.io.InputStream
import java.io.InputStreamReader
import java.util.*
import kotlin.collections.ArrayList
import kotlin.math.ceil
import kotlin.math.floor
import kotlin.math.log2
import kotlin.math.sqrt
fun main(args: Array<String>) {

    val scanner = Scanner(System.`in`)
    val arr = IntArray(26)
    for (i in scanner.next())
        arr[i - 'A']++
    for (i in scanner.next())
        arr[i - 'A']++
    for (i in scanner.next())
        arr[i- 'A']--
    for (i in arr) {
        if (i != 0) {
            println("NO")
            return
        }
    }
    println("YES")

}

class Scanner(s: InputStream) {
    var st: StringTokenizer? = null
    var br: BufferedReader = BufferedReader(InputStreamReader(s))
    @Throws(IOException::class)
    operator fun next(): String {
        while (st == null || !st!!.hasMoreTokens())
            st = StringTokenizer(br.readLine())
        return st!!.nextToken()
    }
    @Throws(IOException::class)
    fun nextInt(): Int {
        return Integer.parseInt(next())
    }
    @Throws(IOException::class)
    fun nextLong(): Long {
        return java.lang.Long.parseLong(next())
    }
    @Throws(IOException::class)
    fun nextLine(): String {
        return br.readLine()
    }
    @Throws(IOException::class)
    fun nextDouble(): Double {
        return java.lang.Double.parseDouble(next())
    }
    @Throws(IOException::class)
    fun ready(): Boolean {
        return br.ready()
    }
}
//class Pair(var a: Int, var b: Int): Comparable<Pair> {
//    override fun compareTo(other: Pair): Int {
//        return b - a - other.b + other.a
//    }
//}

import java.io.*
import java.util.*

class ProblemIO(val rd: BufferedReader, val wr: PrintWriter) {
    var tok = StringTokenizer("")

    companion object {
        fun console() = ProblemIO(BufferedReader(InputStreamReader(System.`in`)), PrintWriter(System.out))
        fun files(inputFilename: String, outputFilename: String) =
                ProblemIO(BufferedReader(FileReader(File(inputFilename))), PrintWriter(File(outputFilename)))
    }

    fun readToken(): String {
        while (!tok.hasMoreTokens()) {
            tok = StringTokenizer(rd.readLine())
        }
        return tok.nextToken()
    }

    fun readInt(): Int = readToken().toInt()
    fun <T> print(v: T) = wr.print(v)
    fun <T> println(v: T) = wr.println(v)
    fun close() {
        rd.close()
        wr.close()
    }
}

fun solve() {
    val io = ProblemIO.console()
    val a = io.readToken()
    val b = io.readToken()
    val c = io.readToken()
    val s1 = (a + b).toCharArray().sortedArray()
    val s2 = c.toCharArray().sortedArray()
    val res = Arrays.equals(s1, s2)
    io.println(if (res) "YES" else "NO")
    io.close()
}

fun main(args: Array<String>) {
    Thread({ solve() }).start()
}

fun main()
{
    val one = (readLine()!! + readLine()!!).asSequence().sorted().joinToString("")

    val both = readLine()!!.asSequence().sorted().joinToString("")
    println(if (one == both ) "YES" else "NO")
}

fun main() {
    val r = System.`in`.bufferedReader()
    val s = StringBuilder()
    val s1 = r.readLine()!!
    val s2 = r.readLine()!!
    val s3 = r.readLine()!!
    val c1 = mutableListOf<Char>()
    s1.forEach { c1 += it }
    s2.forEach { c1 += it }
    val c2 = mutableListOf<Char>()
    s3.forEach { c2 += it }
    if (c1.size!=c2.size){
        println("NO")
    }else{
        var can = true
        c1.sort()
        c2.sort()
        (0..c1.size-1).forEach { if (c1[it]!=c2[it]) can = false }
        println(if (can) "YES" else "NO")
    }
}

import java.util.*
fun main(args: Array<String>) {
                val input = Scanner(System.`in`)

                val s1 = (input.next() + input.next()).toCharArray()
                val s2 = input.next().toCharArray()

                Arrays.sort(s1)
                Arrays.sort(s2)

                if (Arrays.equals(s1, s2))
                        println("YES")
                else
                        print("NO")

        }

import java.io.*
import java.math.BigDecimal
import java.math.BigInteger
import java.util.*
import kotlin.collections.HashSet

object programkt {
    interface Scanner {
        fun changeInputStream(inputStream: InputStream)
        fun nextInt(): Int
        fun nextLong(): Long
        fun nextDouble(): Double
        fun nextChar(): Char
        fun nextString(): String
        fun nextLine(): String
        fun nextBigInteger(): BigInteger
        fun nextBigDecimal(): BigDecimal
    }

    abstract class Task {
        //KT Extensions
        fun <T : Comparable<T>> min(a: T, b: T) = if (a > b) b else a
        fun <T : Comparable<T>> max(a: T, b: T) = if (a < b) b else a
        fun abs(a: Int) = if (a > 0) a else -(a)
        fun abs(a: Long) = if (a > 0) a else -(a)
        fun abs(a: Float) = if (a > 0) a else -(a)
        fun abs(a: Double) = if (a > 0) a else -(a)
        operator fun <T> Iterable<T>.invoke(function: (it: T) -> Unit) { this.forEach(function) }
        private fun String.prefix(pi: Array<Int>): Array<Int> {
            pi[0] = 0
            (1 until this.length) {
                var j = pi[it - 1]
                while (j > 0 && this[it] != this[j]) {
                    j = pi[j - 1]
                }
                if(this[it] == this[j]) {
                    j++
                }
                pi[it] = j
            }
            return pi
        }
        private fun String.kmpFind(pattern: String): Int {
            val m = pattern.length
            val dfa = Array(256) { IntArray(m) }
            dfa[pattern[0].toInt()][0] = 1
            var x = 0
            var j = 1
            while (j < m) {
                for (c in 0 until 256) {
                    dfa[c][j] = dfa[c][x]        // Copy mismatch cases.
                }
                dfa[pattern[j].toInt()][j] = j + 1   // Set match case.
                x = dfa[pattern[j].toInt()][x]       // Update restart state.
                j++
            }

            val n = this.length
            var i: Int = 0
            j = 0
            while (i < n && j < m) {
                j = dfa[this[i].toInt()][j]
                i++
            }
            if (j == m) return i - m    // found
            return n                    // not found
        }
        fun fuckExceptions(invoker: () -> Unit) = try { invoker.invoke() } catch (_: Throwable) {}

        enum class EdgeType {
            DIRECTED,
            UNDIRECTED
        }
        data class Vertex<T: Comparable<T>>(
                val data: T
        ) {
            override fun toString(): String = "V:$data"
        }
        data class Edge<T:Comparable<T>>(
                var source: Vertex<T>,
                var destination: Vertex<T>,
                val weight: Double?
        )
        interface Graphable<T: Comparable<T>> {
            fun createVertex(data: T): Vertex<T>
            fun add(type: EdgeType, source: Vertex<T>, destination: Vertex<T>, weight: Double? = 0.0)
            fun weight(source: Vertex<T>, destination: Vertex<T>): Double?
            fun edges(source: Vertex<T>): MutableList<Edge<T>>?
        }
        class AdjacencyList<T: Comparable<T>>: Graphable<T> {
            var adjacencyMap: MutableMap<Vertex<T>, MutableList<Edge<T>>> = mutableMapOf()

            private fun addDirectedEdge(source: Vertex<T>, destination: Vertex<T>, weight: Double?) {
                adjacencyMap[source]?.add(Edge(source = source, destination = destination, weight = weight))
            }

            private fun addUndirectedEdge(source: Vertex<T>, destination: Vertex<T>, weight: Double?) {
                addDirectedEdge(source, destination, weight)
                addDirectedEdge(destination, source, weight)
            }

            override fun createVertex(data: T): Vertex<T> {
                val vertex = Vertex(data = data)
                adjacencyMap[vertex] ?: run {
                    adjacencyMap[vertex] = mutableListOf()
                }
                return vertex
            }

            override fun add(type: EdgeType, source: Vertex<T>, destination: Vertex<T>, weight: Double?) = when(type) {
                EdgeType.DIRECTED -> addDirectedEdge(source, destination, weight)
                EdgeType.UNDIRECTED -> addUndirectedEdge(source, destination, weight)
            }

            override fun weight(source: Vertex<T>, destination: Vertex<T>): Double? {
                adjacencyMap[source]?.forEach {
                    if(it.destination == destination) return it.weight
                }
                return null
            }

            override fun edges(source: Vertex<T>): MutableList<Edge<T>>? = adjacencyMap[source]

            override fun toString(): String {
                var result = ""
                for ((vertex, edges) in adjacencyMap) {
                    var edgeString = ""
                    for ((index, edge) in edges.withIndex()) {
                        edgeString += if (index != edges.count() - 1) "${edge.destination}, "
                        else "${edge.destination}"
                    }
                    result += "$vertex ---> [ $edgeString ] \n"
                }
                return result
            }

            fun depthFirstSearch(start: Vertex<T>, end: Vertex<T>): Stack<Vertex<T>> {
                val visited: HashSet<Vertex<T>> = hashSetOf()
                val stack: Stack<Vertex<T>> = Stack()
                stack.push(start)
                visited.add(start)

                var currentVertex = stack.peek()
                loop@while (currentVertex != null && currentVertex != end) {
                    val neighbors = edges(currentVertex)
                    if(neighbors != null && neighbors.count() > 0) {
                        for(edge in neighbors) {
                            if(!visited.contains(edge.destination)) {
                                visited.add(edge.destination)
                                stack.push(edge.destination)
                                currentVertex = stack.peek()
                                continue@loop
                            }
                        }
                    } else {
                        stack.pop()
                        currentVertex = stack.peek()
                        continue
                    }

                    stack.pop()
                    currentVertex = stack.peek()
                }

                return stack
            }

            fun breadthFirstSearch() {

            }
        }
        //End KT Extensions

        abstract fun solve(scanner: Scanner, printer: PrintWriter)
    }

    class FastScanner: Scanner {
        var inputStream: InputStream? = null
        override fun changeInputStream(inputStream: InputStream) {
            this.inputStream = inputStream
            this.bufferedReader = BufferedReader(InputStreamReader(inputStream))
        }

        private lateinit var bufferedReader: BufferedReader
        private var stringTokenizer: StringTokenizer? = null

        private fun nextToken(): String? {
            while (stringTokenizer == null || !stringTokenizer!!.hasMoreTokens())
                stringTokenizer = StringTokenizer(bufferedReader.readLine() ?: return null)
            return stringTokenizer!!.nextToken()
        }

        override fun nextInt() = nextToken()!!.toInt()
        override fun nextLong() = nextToken()!!.toLong()
        override fun nextDouble() = nextToken()!!.toDouble()
        override fun nextChar() = bufferedReader.read().toChar()
        override fun nextString() = nextToken()!!
        override fun nextLine() = bufferedReader.readLine()!!
        override fun nextBigInteger() = BigInteger(nextToken()!!)
        override fun nextBigDecimal() = BigDecimal(nextToken()!!)
    }

    class TaskBuilder {
        private var task: Task? = null
        private var inputStream: InputStream? = null
        private var outputStream: OutputStream? = null
        private var scanner: Scanner? = null

        fun useInputSource(inputStream: InputStream): TaskBuilder {
            this.inputStream = inputStream
            return this
        }

        fun useOutputSource(outputStream: OutputStream): TaskBuilder {
            this.outputStream = outputStream
            return this
        }

        fun useInputFile(inputFileName: String): TaskBuilder {
            this.inputStream = FileInputStream(File(inputFileName))
            return this
        }

        fun useOutputFile(outputFileName: String): TaskBuilder {
            this.outputStream = FileOutputStream(File(outputFileName))
            return this
        }

        fun useScanner(scanner: Scanner): TaskBuilder {
            this.scanner = scanner
            return this
        }

        fun solveTask(task: Task): TaskBuilder {
            this.task = task
            return this
        }

        fun run() {
            when {
                task == null -> throw NullPointerException("Task cannot be null!")
                inputStream == null -> throw NullPointerException("Input cannot be null!")
                outputStream == null -> throw NullPointerException("Output cannot be null!")
                scanner == null -> throw NullPointerException("Scanner cannot be null!")
            }
            scanner!!.changeInputStream(inputStream!!)
            val printer = PrintWriter(outputStream)
            TaskRunnable(task!!, scanner!!, printer).run()

            inputStream!!.close()
            printer.close()
        }

        class TaskRunnable(
                private val task: Task,
                private val scanner: Scanner,
                private val printer: PrintWriter
        ) {
            fun run() {
                task.solve(scanner, printer)
            }
        }
    }

    @JvmStatic
    fun main(args: Array<String>) = TaskBuilder()
            .useInputSource(System.`in`)
            .useOutputSource(System.out)
            .useScanner(FastScanner())
            .solveTask(TaskB())
            .run()

    class TaskA: Task() {
        override fun solve(scanner: Scanner, printer: PrintWriter) {
            val countOfRooms = scanner.nextInt()
            val rooms = Array(countOfRooms) { scanner.nextInt() to scanner.nextInt() }
            printer.println(rooms
                    .map { it.second - it.first }
                    .filter { it >= 2 }
                    .count())
        }

    }

    class TaskB: Task() {
        override fun solve(scanner: Scanner, printer: PrintWriter) {
            val firstName = scanner.nextLine()
            val secondName = scanner.nextLine()
            val mixedUpName = scanner.nextLine()

            val alphabet = Array(26) { 0 }
            val mixedUpAlphabet = Array(26) { 0 }

            firstName.forEach { alphabet[it - 'A']++ }
            secondName.forEach { alphabet[it - 'A']++ }
            mixedUpName.forEach {  mixedUpAlphabet[it - 'A']++ }

            for (it in 0..25) {
                if (alphabet[it] != mixedUpAlphabet[it]) {
                    printer.println("NO")
                    return
                }

            }
            printer.println("YES")
        }

    }
}

fun main() {
    val firstLine = readLine()!!.map { it.toString() }
    val secLine = readLine()!!.map { it.toString() }
    val thirdLine = readLine()!!.map { it.toString() }

    val result = firstLine + secLine

    if (thirdLine.sorted() == result.sorted()) {
        print("YES")
    } else {
        print("NO")
    }
}

import java.util.*

fun String.freqs(): HashMap<Char, Int> {
    val map = hashMapOf<Char, Int>()
    forEach { c ->
        if (map.containsKey(c)) map[c] = map[c]!! + 1
        else map[c] = 1
    }
    return map
}

fun main(args: Array<String>) {
    val sc = Scanner(System.`in`)
    val name1 = sc.nextLine()
    val name2 = sc.nextLine()
    val letters = sc.nextLine()
    val map1 = name1.freqs()
    val map2 = name2.freqs()
    val map3 = letters.freqs()

    var ok = true
    map1.forEach { k, v ->
        if (map3.containsKey(k) && map3[k]!! - v >= 0) map3[k] = map3[k]!! - v
        else ok = false
        return@forEach
    }
    if (ok)
        map2.forEach { k, v ->
            if (map3.containsKey(k) && map3[k]!! - v >= 0) map3[k] = map3[k]!! - v
            else ok = false
            return@forEach
        }

    ok = ok && map3.values.sum() == 0

    if (ok)
        println("YES")
    else
        println("NO")
}

import java.util.*

fun main(args: Array<String>) = with(Scanner(System.`in`)){
        val guests = nextLine()!!
        val hosts = nextLine()!!

        val shuffled = nextLine()!!

        if (shuffled.length != hosts.length + guests.length){
            println("NO")
            return
        }

        val guestsAr = guests.toCharArray()
        val hostsAr = hosts.toCharArray()
        val shuffledAr = shuffled.toCharArray()

        val gHelper = IntArray(guests.length){0}
        val hHelper = IntArray(hosts.length){0}

        for (target in shuffledAr){
            var found = false
            for (i in 0..guestsAr.size - 1){
                if (guestsAr[i] == target && gHelper[i] ==0) {
                    found = true
                    gHelper[i] = 1
                    break
                }
            }

            if(found){
                continue
            }

            for (i in 0..hostsAr.size - 1){
                if (hostsAr[i] == target && hHelper[i] ==0) {
                    found = true
                    hHelper[i] = 1
                    break
                }
            }
            if(!found){
                println("NO")
                return
            }
        }
        println("YES")
}

import java.io.*
import java.lang.StringBuilder
import java.util.*

fun main(args: Array<String>) {
    val inputStream = System.`in`
    val outputStream = System.out
    val input = InputReader(inputStream)
    val output = PrintWriter(outputStream)
    val solver = Task()
    solver.solve(input, output)
    output.close()
}

private class Task {
    fun solve(input: InputReader, output: PrintWriter) {
        output.println(if (StringBuilder(input.next()).append(input.next()).toList().sorted() == input.next().toList().sorted()) "YES" else "NO")
    }
}

private class InputReader(stream: InputStream) {
    private var reader: BufferedReader = BufferedReader(InputStreamReader(stream), 32768)
    private var tokenizer: StringTokenizer? = null

    operator fun next(): String {
        while (tokenizer == null || tokenizer?.hasMoreTokens()?.not() == true) {
            try {
                tokenizer = StringTokenizer(reader.readLine())
            } catch (e: IOException) {
                throw RuntimeException(e)
            }

        }
        return tokenizer!!.nextToken()
    }

    fun nextInt(): Int {
        return next().toInt()
    }

}

fun main(){
    var arrChar = readLine()!!.toCharArray().toMutableList()
    arrChar.addAll(readLine()!!.toCharArray().toMutableList())
    arrChar.sort()
    var str = readLine()!!.toCharArray().toMutableList()
    str.sort()
    println(if (arrChar.equals(str)) "YES" else "NO")
}

import java.util.*

fun main(args: Array<String>) {
    val sc = Scanner(System.`in`)
    val guest = sc.next()
    val host = sc.next()
    val mixed = sc.next().toCharArray().sorted()
    val sm = (guest + host).toCharArray().sorted()

    if (mixed == sm) {
        print("YES")
    } else print("NO")

}

fun main(args: Array<String>) {
    val name = readLine()!! + readLine()!!
    val let = readLine()!!

    val countChars = name.groupingBy { it }.eachCount()
    val countLet = let.groupingBy { it }.eachCount()

    println(if (countChars == countLet) "YES" else "NO")
}

fun main(args: Array<String>) {
    val name1 = readLine()!!
    val name2 = readLine()!!
    val mix = readLine()!!
    if ((name1 + name2).toCharArray().also { it.sort() }.contentEquals(mix.toCharArray().also { it.sort() }))
        println("YES")
    else
        println("NO")
}

import java.util.*

fun main(){

    val scan = Scanner(System.`in`)
    var arr = Array<Int>(26){ _ -> 0}
    var line = scan.next() + scan.next()

    for (i in line){
        arr[i.toInt()-65]++
    }

    for (i in scan.next()){
        arr[i.toInt()-65]--
    }

    var a = true
    for (i in arr) if (i != 0){
        a = false
        break
    }

    if (a) print("YES")
    else print("NO")

}

fun main() {
    val a = (readLine()!! + readLine()!!).asSequence().sorted().joinToString("")
    val b = readLine()!!.asSequence().sorted().joinToString("")
    println(if (a == b) "YES" else "NO")
}

import kotlin.system.exitProcess

fun main() {
    var arr = IntArray(26)
    for(i in 1..2) {
        readLine()!!.toCharArray().let {
            for(x in it) {
                arr[x - 'A']++
            }
        }
    }
    readLine()!!.toCharArray().let {
        for(x in it) {
            arr[x - 'A']--
        }
    }
    for(x in arr) {
        if(x != 0) {
            println("NO")
            exitProcess(0)
        }
    }
    println("YES")
}

fun main(args: Array<String>) {
    val was = (readLine()!! + readLine()!!).toCharArray().apply {sort()}
    val become = readLine()!!.toCharArray().apply {sort()}

    println(if (was.contentEquals(become)) "YES" else "NO")
}

fun main(args: Array<String>) {
    val was = (readLine()!! + readLine()!!).toCharArray().sorted()
    val become = readLine()!!.toCharArray().sorted()

    println(if (was == become) "YES" else "NO")
}

private fun readLn() = readLine()!! // string line
private fun readInt() = readLn().toInt() // single int
private fun readLong() = readLn().toLong() // single long
private fun readDouble() = readLn().toDouble() // single double
private fun readStrings() = readLn().split(" ") // list of strings
private fun readInts() = readStrings().map { it.toInt() } // list of ints
private fun readLongs() = readStrings().map { it.toLong() } // list of longs
private fun readDoubles() = readStrings().map { it.toDouble() } // list of doubles

fun main() {
    val a = readLn()
    val b = readLn()
    val c = readLn()

    val aUb = (a+b).groupingBy { it }.eachCount()
    val cU = c.groupingBy { it }.eachCount()

    if (aUb == cU) println("YES") else println("NO")
}

fun main(args: Array<String>) {
    val s = (readLine()!! + readLine()!!).toCharArray().sorted().joinToString("")
    val line = readLine()!!.toCharArray().sorted().joinToString("")
    println(if (s == line) "YES" else "NO")
}

import java.util.*

fun min(a:Double,b:Double) = if (a<b) a else b
fun max(a:Double,b:Double) = if (a>b) a else b
fun min(a:Long,b:Long) = if (a<b) a else b
fun max(a:Long,b:Long) = if (a>b) a else b

fun readLn():String = readLine()!!.toString()
fun readLong() = readLn().toLong()
fun readLongs()  = readLn().split(" ").map{it.toLong()}
var nul=0.toLong();
var one=1.toLong();
var two=2.toLong();
var three=3.toLong();
var four=4.toLong();
var five=5.toLong();
fun powmod(a:Long,b:Long,mod:Long):Long {

    if (b==1.toLong()) return a;
    var k=powmod(a,b/2,mod);
    if (b%2==0.toLong())
    { return (k*k)%mod }
    else { k=k*k; k=k%mod; k=k*a; k=k%mod; return k; }
}
fun prime (p:Long):Long {
    if (p==one) return 0.toLong();
    var i=two;
    while (i*i<=p) {if (p%i==nul) return i; i++; }
    return one;
}
fun inv (a:Long,mod:Long):Long {
return powmod(a,mod-2,mod);
}

fun solve() {
    val cin = Scanner(System.`in`)

    /*
    var map=hashMapOf<String,Int>();
    map[q] <=> map.getOrDefault(q,0)
    Сортировка вектора пар - k=v.sortedWith(compareBy({it.first},{it.second}));
    prLong("${k[i].second}"); - вывод аргумента пары
    var m=ArrayList<Long> (); <=> vector
    getline(cin,a) <=> readLine()!!.last()
   readLong() - одно число
   readLongs() - несколько чисел
   readLine()!!.toCharArray() - возвращает массив чаров из строки

    */
    /* --------- */
        // ВСЕГДА ПИСАТЬ В ЛОНГАХ

    var a=readLine()!!.toString();
    var b=readLine()!!.toString();
    var c=readLine()!!.toString();

            var qq=LongArray(26);

          for (i in 0..a.length-1) {
              qq[a[i]-'A']++;
          }
    for (i in 0..b.length-1) {
        qq[b[i]-'A']++;
    }
    for (i in 0..c.length-1) {
        qq[c[i]-'A']--;
    }
    var check=one;
    for (i in 0..25) if (qq[i]>nul || qq[i]<nul) check=nul;
    if (check==nul) print("NO"); else print("YES");

    /* --------- */

}

fun main() {
    val cin = Scanner(System.`in`)

    var T=one;
    //T=readLine()!!.toLong();
    for (i55555 in 1..T) solve()
}

fun main(args: Array<String>) {
    var first = readLine()!!.toString()
    var second = readLine()!!.toString()
    var all = readLine()!!.toString()

    if (first.length + second.length != all.length){
        println("NO")
        return
    }

    var t1 = (first + second).toCharArray().sortedArray()
    var t2 = all.toCharArray().sortedArray()

    for (i in 0..all.length-1) {
        if (t1[i] != t2[i]){
            println("NO")
            return
        }
    }
    println("YES")
    return
}

fun main(args: Array<String>) {
        var s = readLine()!!
        var S = readLine()!!
        var W = readLine()!!
        var c = 0
        var C = 0
        var j = 0
        for (i in 0 until W.count()) {
                if (s[j] == W[i]) {
                        c++
                        j++
                }
        }
        j = 0
        for (i in 0 until W.count()) {
                if (S[j] == W[i]) {
                        C++
                        j++
                }
        }
        if ((c == s.length) || (C == S.length)) {
                print("YES")
        } else {
                print("NO")
        }
}

import java.io.*
import java.math.BigDecimal
import java.math.BigInteger
import java.util.*
import kotlin.collections.HashSet

object programkt {
    interface Scanner {
        fun changeInputStream(inputStream: InputStream)
        fun nextInt(): Int
        fun nextLong(): Long
        fun nextDouble(): Double
        fun nextChar(): Char
        fun nextString(): String
        fun nextLine(): String
        fun nextBigInteger(): BigInteger
        fun nextBigDecimal(): BigDecimal
    }

    abstract class Task {
        //KT Extensions
        fun <T : Comparable<T>> min(a: T, b: T) = if (a > b) b else a
        fun <T : Comparable<T>> max(a: T, b: T) = if (a < b) b else a
        fun abs(a: Int) = if (a > 0) a else -(a)
        fun abs(a: Long) = if (a > 0) a else -(a)
        fun abs(a: Float) = if (a > 0) a else -(a)
        fun abs(a: Double) = if (a > 0) a else -(a)
        operator fun <T> Iterable<T>.invoke(function: (it: T) -> Unit) { this.forEach(function) }
        private fun String.prefix(pi: Array<Int>): Array<Int> {
            pi[0] = 0
            (1 until this.length) {
                var j = pi[it - 1]
                while (j > 0 && this[it] != this[j]) {
                    j = pi[j - 1]
                }
                if(this[it] == this[j]) {
                    j++
                }
                pi[it] = j
            }
            return pi
        }
        private fun String.kmpFind(pattern: String): Int {
            val m = pattern.length
            val dfa = Array(256) { IntArray(m) }
            dfa[pattern[0].toInt()][0] = 1
            var x = 0
            var j = 1
            while (j < m) {
                for (c in 0 until 256) {
                    dfa[c][j] = dfa[c][x]        // Copy mismatch cases.
                }
                dfa[pattern[j].toInt()][j] = j + 1   // Set match case.
                x = dfa[pattern[j].toInt()][x]       // Update restart state.
                j++
            }

            val n = this.length
            var i: Int = 0
            j = 0
            while (i < n && j < m) {
                j = dfa[this[i].toInt()][j]
                i++
            }
            if (j == m) return i - m    // found
            return n                    // not found
        }
        fun fuckExceptions(invoker: () -> Unit) = try { invoker.invoke() } catch (_: Throwable) {}

        enum class EdgeType {
            DIRECTED,
            UNDIRECTED
        }
        data class Vertex<T: Comparable<T>>(
                val data: T
        ) {
            override fun toString(): String = "V:$data"
        }
        data class Edge<T:Comparable<T>>(
                var source: Vertex<T>,
                var destination: Vertex<T>,
                val weight: Double?
        )
        interface Graphable<T: Comparable<T>> {
            fun createVertex(data: T): Vertex<T>
            fun add(type: EdgeType, source: Vertex<T>, destination: Vertex<T>, weight: Double? = 0.0)
            fun weight(source: Vertex<T>, destination: Vertex<T>): Double?
            fun edges(source: Vertex<T>): MutableList<Edge<T>>?
        }
        class AdjacencyList<T: Comparable<T>>: Graphable<T> {
            var adjacencyMap: MutableMap<Vertex<T>, MutableList<Edge<T>>> = mutableMapOf()

            private fun addDirectedEdge(source: Vertex<T>, destination: Vertex<T>, weight: Double?) {
                adjacencyMap[source]?.add(Edge(source = source, destination = destination, weight = weight))
            }

            private fun addUndirectedEdge(source: Vertex<T>, destination: Vertex<T>, weight: Double?) {
                addDirectedEdge(source, destination, weight)
                addDirectedEdge(destination, source, weight)
            }

            override fun createVertex(data: T): Vertex<T> {
                val vertex = Vertex(data = data)
                adjacencyMap[vertex] ?: run {
                    adjacencyMap[vertex] = mutableListOf()
                }
                return vertex
            }

            override fun add(type: EdgeType, source: Vertex<T>, destination: Vertex<T>, weight: Double?) = when(type) {
                EdgeType.DIRECTED -> addDirectedEdge(source, destination, weight)
                EdgeType.UNDIRECTED -> addUndirectedEdge(source, destination, weight)
            }

            override fun weight(source: Vertex<T>, destination: Vertex<T>): Double? {
                adjacencyMap[source]?.forEach {
                    if(it.destination == destination) return it.weight
                }
                return null
            }

            override fun edges(source: Vertex<T>): MutableList<Edge<T>>? = adjacencyMap[source]

            override fun toString(): String {
                var result = ""
                for ((vertex, edges) in adjacencyMap) {
                    var edgeString = ""
                    for ((index, edge) in edges.withIndex()) {
                        edgeString += if (index != edges.count() - 1) "${edge.destination}, "
                        else "${edge.destination}"
                    }
                    result += "$vertex ---> [ $edgeString ] \n"
                }
                return result
            }

            fun depthFirstSearch(start: Vertex<T>, end: Vertex<T>): Stack<Vertex<T>> {
                val visited: HashSet<Vertex<T>> = hashSetOf()
                val stack: Stack<Vertex<T>> = Stack()
                stack.push(start)
                visited.add(start)

                var currentVertex = stack.peek()
                loop@while (currentVertex != null && currentVertex != end) {
                    val neighbors = edges(currentVertex)
                    if(neighbors != null && neighbors.count() > 0) {
                        for(edge in neighbors) {
                            if(!visited.contains(edge.destination)) {
                                visited.add(edge.destination)
                                stack.push(edge.destination)
                                currentVertex = stack.peek()
                                continue@loop
                            }
                        }
                    } else {
                        stack.pop()
                        currentVertex = stack.peek()
                        continue
                    }

                    stack.pop()
                    currentVertex = stack.peek()
                }

                return stack
            }

            fun breadthFirstSearch() {

            }
        }
        //End KT Extensions

        abstract fun solve(scanner: Scanner, printer: PrintWriter)
    }

    class FastScanner: Scanner {
        var inputStream: InputStream? = null
        override fun changeInputStream(inputStream: InputStream) {
            this.inputStream = inputStream
            this.bufferedReader = BufferedReader(InputStreamReader(inputStream))
        }

        private lateinit var bufferedReader: BufferedReader
        private var stringTokenizer: StringTokenizer? = null

        private fun nextToken(): String? {
            while (stringTokenizer == null || !stringTokenizer!!.hasMoreTokens())
                stringTokenizer = StringTokenizer(bufferedReader.readLine() ?: return null)
            return stringTokenizer!!.nextToken()
        }

        override fun nextInt() = nextToken()!!.toInt()
        override fun nextLong() = nextToken()!!.toLong()
        override fun nextDouble() = nextToken()!!.toDouble()
        override fun nextChar() = bufferedReader.read().toChar()
        override fun nextString() = nextToken()!!
        override fun nextLine() = bufferedReader.readLine()!!
        override fun nextBigInteger() = BigInteger(nextToken()!!)
        override fun nextBigDecimal() = BigDecimal(nextToken()!!)
    }

    class TaskBuilder {
        private var task: Task? = null
        private var inputStream: InputStream? = null
        private var outputStream: OutputStream? = null
        private var scanner: Scanner? = null

        fun useInputSource(inputStream: InputStream): TaskBuilder {
            this.inputStream = inputStream
            return this
        }

        fun useOutputSource(outputStream: OutputStream): TaskBuilder {
            this.outputStream = outputStream
            return this
        }

        fun useInputFile(inputFileName: String): TaskBuilder {
            this.inputStream = FileInputStream(File(inputFileName))
            return this
        }

        fun useOutputFile(outputFileName: String): TaskBuilder {
            this.outputStream = FileOutputStream(File(outputFileName))
            return this
        }

        fun useScanner(scanner: Scanner): TaskBuilder {
            this.scanner = scanner
            return this
        }

        fun solveTask(task: Task): TaskBuilder {
            this.task = task
            return this
        }

        fun run() {
            when {
                task == null -> throw NullPointerException("Task cannot be null!")
                inputStream == null -> throw NullPointerException("Input cannot be null!")
                outputStream == null -> throw NullPointerException("Output cannot be null!")
                scanner == null -> throw NullPointerException("Scanner cannot be null!")
            }
            scanner!!.changeInputStream(inputStream!!)
            val printer = PrintWriter(outputStream)
            TaskRunnable(task!!, scanner!!, printer).run()

            inputStream!!.close()
            printer.close()
        }

        class TaskRunnable(
                private val task: Task,
                private val scanner: Scanner,
                private val printer: PrintWriter
        ) {
            fun run() {
                task.solve(scanner, printer)
            }
        }
    }

    @JvmStatic
    fun main(args: Array<String>) = TaskBuilder()
            .useInputSource(System.`in`)
            .useOutputSource(System.out)
            .useScanner(FastScanner())
            .solveTask(TaskB())
            .run()

    class TaskA: Task() {
        override fun solve(scanner: Scanner, printer: PrintWriter) {
            val countOfRooms = scanner.nextInt()
            val rooms = Array(countOfRooms) { scanner.nextInt() to scanner.nextInt() }
            printer.println(rooms
                    .map { it.second - it.first }
                    .filter { it >= 2 }
                    .count())
        }

    }

    class TaskB: Task() {
        override fun solve(scanner: Scanner, printer: PrintWriter) {
            val firstName = scanner.nextLine()
            val secondName = scanner.nextLine()
            val mixedUpName = scanner.nextLine()

            val alphabet = Array(26) { 0 }
            val mixedUpAlphabet = Array(26) { 0 }

            firstName.forEach { alphabet[it - 'A']++ }
            secondName.forEach { alphabet[it - 'A']++ }
            mixedUpName.forEach {  mixedUpAlphabet[it - 'A']++ }

            (0..25) {
                if (alphabet[it] != mixedUpAlphabet[it]) {
                    printer.println("NO")
                    System.exit(0)
                }

            }
            printer.println("YES")
        }

    }
}

fun main() {
    val firstLine = readLine()!!.map { it.toString() }
    val secLine = readLine()!!.map { it.toString() }
    val thirdLine = readLine()!!.map { it.toString() }

    if (thirdLine - secLine == firstLine) {
        print("YES")
    } else {
        print("NO")
    }
}

fun main(){
    var arrChar = readLine()!!.toCharArray().toMutableList()
    arrChar.addAll(readLine()!!.toCharArray().toMutableList())
    arrChar.sort()
    var str = readLine()!!.toCharArray().toMutableList()
    str.sort()
    println(if (arrChar.equals(str)) "Yes" else "NO")
}

import java.util.*

fun main(){

    val scan = Scanner(System.`in`)
    var arr = Array<Int>(26){ _ -> 0}
    var line = scan.next() + scan.next()

    for (i in line){
        arr[i.toInt()-65]++
    }

    for (i in scan.next()){
        arr[i.toInt()-65]--
    }

    var a = 0
    for (i in arr) a+=i

    if (a == 0) print("YES")
    else print("NO")

}

private fun readLn() = readLine()!! // string line
private fun readInt() = readLn().toInt() // single int
private fun readLong() = readLn().toLong() // single long
private fun readDouble() = readLn().toDouble() // single double
private fun readStrings() = readLn().split(" ") // list of strings
private fun readInts() = readStrings().map { it.toInt() } // list of ints
private fun readLongs() = readStrings().map { it.toLong() } // list of longs
private fun readDoubles() = readStrings().map { it.toDouble() } // list of doubles

fun main() {
    val a = readLn()
    val b = readLn()
    val c = readLn()

    val aUb = a.groupingBy { it }.eachCount() + b.groupingBy { it }.eachCount()
    val cU = c.groupingBy { it }.eachCount()

    var sufficient = true
    for ((char, count) in cU) {
        val inA = aUb[char]
        if (inA == null) {
            sufficient = false
            break
        }
        if (inA<count) {
            sufficient = false
            break
        }
    }

    if(sufficient) println("YES") else println("NO")
}

private fun readLn() = readLine()!! // string line
private fun readInt() = readLn().toInt() // single int
private fun readLong() = readLn().toLong() // single long
private fun readDouble() = readLn().toDouble() // single double
private fun readStrings() = readLn().split(" ") // list of strings
private fun readInts() = readStrings().map { it.toInt() } // list of ints
private fun readLongs() = readStrings().map { it.toLong() } // list of longs
private fun readDoubles() = readStrings().map { it.toDouble() } // list of doubles

fun main() {
    val a = readLn()
    val b = readLn()
    val c = readLn()

    val aUb = a.groupingBy { it }.eachCount() + b.groupingBy { it }.eachCount()
    val cU = c.groupingBy { it }.eachCount()

    if(aUb == cU) println("YES") else println("NO")
}

import java.util.*

fun min(a:Double,b:Double) = if (a<b) a else b
fun max(a:Double,b:Double) = if (a>b) a else b
fun min(a:Long,b:Long) = if (a<b) a else b
fun max(a:Long,b:Long) = if (a>b) a else b

fun readLn():String = readLine()!!.toString()
fun readLong() = readLn().toLong()
fun readLongs()  = readLn().split(" ").map{it.toLong()}
var nul=0.toLong();
var one=1.toLong();
var two=2.toLong();
var three=3.toLong();
var four=4.toLong();
var five=5.toLong();
fun powmod(a:Long,b:Long,mod:Long):Long {

    if (b==1.toLong()) return a;
    var k=powmod(a,b/2,mod);
    if (b%2==0.toLong())
    { return (k*k)%mod }
    else { k=k*k; k=k%mod; k=k*a; k=k%mod; return k; }
}
fun prime (p:Long):Long {
    if (p==one) return 0.toLong();
    var i=two;
    while (i*i<=p) {if (p%i==nul) return i; i++; }
    return one;
}
fun inv (a:Long,mod:Long):Long {
return powmod(a,mod-2,mod);
}

fun solve() {
    val cin = Scanner(System.`in`)

    /*
    var map=hashMapOf<String,Int>();
    map[q] <=> map.getOrDefault(q,0)
    Сортировка вектора пар - k=v.sortedWith(compareBy({it.first},{it.second}));
    prLong("${k[i].second}"); - вывод аргумента пары
    var m=ArrayList<Long> (); <=> vector
    getline(cin,a) <=> readLine()!!.last()
   readLong() - одно число
   readLongs() - несколько чисел
   readLine()!!.toCharArray() - возвращает массив чаров из строки

    */
    /* --------- */
        // ВСЕГДА ПИСАТЬ В ЛОНГАХ

    var a=readLine()!!.toString();
    var b=readLine()!!.toString();
    var c=readLine()!!.toString();

            var qq=LongArray(26);

          for (i in 0..a.length-1) {
              qq[a[i]-'A']++;
          }
    for (i in 0..b.length-1) {
        qq[b[i]-'A']++;
    }
    for (i in 0..c.length-1) {
        qq[c[i]-'A']--;
    }
    var check=one;
    for (i in 0..25) if (qq[i]>nul) check=nul;
    if (check==nul) print("NO"); else print("YES");

    /* --------- */

}

fun main() {
    val cin = Scanner(System.`in`)

    var T=one;
    //T=readLine()!!.toLong();
    for (i55555 in 1..T) solve()
}