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")
}

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")
}

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()
}