package main
import (
"bufio"
"io"
"os"
"strconv"
)
type DSU struct {
parent []int
size []int
}
func NewDSU(n int) *DSU {
parent := make([]int, n+1)
size := make([]int, n+1)
for i := 1; i <= n; i++ {
parent[i] = i
size[i] = 1
}
return &DSU{parent: parent, size: size}
}
func (d *DSU) Find(x int) int {
for x != d.parent[x] {
d.parent[x] = d.parent[d.parent[x]]
x = d.parent[x]
}
return x
}
func (d *DSU) Union(a, b int) int {
a = d.Find(a)
b = d.Find(b)
if a == b {
return a
}
if d.size[a] < d.size[b] {
a, b = b, a
}
d.parent[b] = a
d.size[a] += d.size[b]
return a
}
func main() {
data, _ := io.ReadAll(os.Stdin)
idx := 0
nextInt := func() int {
for idx < len(data) && (data[idx] < '0' || data[idx] > '9') {
idx++
}
val := 0
for idx < len(data) && data[idx] >= '0' && data[idx] <= '9' {
val = val*10 + int(data[idx]-'0')
idx++
}
return val
}
n := nextInt()
m := nextInt()
q := nextInt()
adj := make([][]int, n+1)
dsu := NewDSU(n)
for i := 0; i < m; i++ {
a := nextInt()
b := nextInt()
adj[a] = append(adj[a], b)
adj[b] = append(adj[b], a)
dsu.Union(a, b)
}
diam := make([]int, n+1)
seenRoot := make([]bool, n+1)
queue := make([]int, n+1)
dist := make([]int, n+1)
mark := make([]int, n+1)
stamp := 0
bfs := func(start int) (int, int) {
stamp++
head, tail := 0, 0
queue[tail] = start
tail++
mark[start] = stamp
dist[start] = 0
far, maxd := start, 0
for head < tail {
v := queue[head]
head++
dv := dist[v]
if dv > maxd {
maxd = dv
far = v
}
for _, to := range adj[v] {
if mark[to] != stamp {
mark[to] = stamp
dist[to] = dv + 1
queue[tail] = to
tail++
}
}
}
return far, maxd
}
for i := 1; i <= n; i++ {
r := dsu.Find(i)
if !seenRoot[r] {
seenRoot[r] = true
far, _ := bfs(i)
_, d := bfs(far)
diam[r] = d
}
}
out := bufio.NewWriterSize(os.Stdout, 1<<20)
defer out.Flush()
for i := 0; i < q; i++ {
t := nextInt()
if t == 1 {
x := nextInt()
r := dsu.Find(x)
out.WriteString(strconv.Itoa(diam[r]))
out.WriteByte('\n')
} else {
x := nextInt()
y := nextInt()
rx := dsu.Find(x)
ry := dsu.Find(y)
if rx == ry {
continue
}
dx := diam[rx]
dy := diam[ry]
nd := dx
if dy > nd {
nd = dy
}
tm := (dx+1)/2 + (dy+1)/2 + 1
if tm > nd {
nd = tm
}
r := dsu.Union(rx, ry)
diam[r] = nd
}
}
}