import java.util.Scanner

fun main(args: Array<String>) {
	val scn = Scanner(System.`in`)
	val n = scn.nextInt()
	val m = scn.nextInt()
	val k = scn.nextInt()
	val uf = UF(n)
	val fs = IntArray(n){0}
	val bs = Array(n) { mutableSetOf<Int>() }
	repeat(m){
		val a = scn.nextInt()-1
		val b = scn.nextInt()-1
		uf.unite(a, b)
		fs[a]++
		fs[b]++
	}
	repeat(k){
		val c = scn.nextInt()-1
		val d = scn.nextInt()-1
		bs[c].add(d)
		bs[d].add(c)
	}
	val nums = mutableMapOf<Int, Int>()
	repeat(n){
		val r = uf.root(it, true)
		nums[r] = nums.getOrElse(r){0} + 1
	}
	val ans = IntArray(n){i ->
		val r = uf.root(i)
		nums[r]!! - fs[i] - bs[i].filter{uf.same(i, it)}.size - 1
	}
	print(ans.joinToString(separator = " "))
}

class UF(n: Int) {
	val arr: IntArray = IntArray(n){it}
	val fs: BooleanArray = BooleanArray(n){false}

	fun root(x: Int, memo: Boolean = false): Int{
		if (arr[x]!=x && !fs[x]) arr[x]=root(arr[x])
		if (memo) fs[x] = true
		return arr[x]
	}

	fun unite(x:Int, y:Int){
		val rx = root(x)
		val ry = root(y)
		if (rx==ry) return
		arr[rx] = ry
	}

	fun same(x: Int, y: Int): Boolean{
		return root(x) == root(y)
	}
}