10 3 5
1 2
2 3
1 4
2 3 6
1 6
2 1 6
2 8 7
1 10
 10 2 6
1 2
1 3
2 1 8
2 9 2
1 2
1 9
2 3 5
1 8
 10 5 2
1 2
1 3
1 4
2 5
1 6
1 5
1 8
 10 6 64
1 2
2 3
2 4
4 5
3 6
3 7
2 4 4
1 4
1 6
1 5
1 8
2 1 10
2 6 8
2 4 2
1 10
1 6
2 4 3
2 5 9
1 4
2 8 7
2 3 6
2 8 5
2 7 3
2 10 7
2 9 3
1 8
2 7 5
2 6 10
2 5 9
1 10
2 8 9
1 2
2 9 10
2 5 1
2 10 1
2 3 9
2 10 2
2 5 4
1 1
1 5
2 7 5
1 7
2 9 5
2 8 2
1 3
1 10
2 8 8
2 8 2
2 9 8
2 7 10
1 1
1 6
2 1 6
1 2
1 10
2 6 4
1 3
2 6 6
2 10 3
2 3 5
1 2
2 1 7
2 4 4
1 9
1 10
1 5
2 8 3
1 6
1 4
1 8
 10 9 16
1 2
1 3
2 4
2 5
4 6
4 7
6 8
4 9
5 10
2 1 5
2 4 4
1 7
1 8
1 6
1 4
1 10
1 4
2 1 5
2 8 10
2 5 5
2 7 3
2 8 7
2 7 7
2 7 3
2 4 6
 10 5 42
1 2
1 3
2 4
4 5
1 6
1 4
2 9 2
2 10 5
1 4
2 2 7
2 10 5
2 6 10
1 4
1 4
1 2
2 7 8
1 7
2 4 4
2 10 6
2 9 3
1 9
1 2
2 8 1
1 8
2 3 5
1 8
2 5 5
2 2 7
2 8 5
1 9
1 1
2 4 4
2 6 6
2 1 7
1 6
2 8 3
2 7 4
1 8
2 3 6
2 8 6
2 3 6
2 9 3
1 3
1 9
2 3 7
1 2
1 7
 100 22 4
100 24
100 27
100 4
100 60
24 63
63 17
27 89
17 71
63 77
77 43
63 9
100 65
24 14
27 15
60 10
71 16
100 67
10 1
1 40
10 83
43 66
67 18
1 6
1 27
1 6
1 49
 10 7 48
1 2
2 3
2 4
3 5
4 6
6 7
7 8
2 7 4
1 2
2 7 4
1 2
2 5 6
2 3 4
1 8
2 4 4
2 10 3
2 1 3
1 10
1 8
2 2 7
2 2 9
1 10
2 6 7
2 3 6
2 8 1
2 2 6
1 7
2 1 2
1 3
2 4 1
2 5 6
2 7 1
2 4 2
2 1 9
2 6 9
2 6 1
1 1
1 2
1 1
2 2 3
1 4
2 2 2
2 4 7
2 5 5
2 5 7
1 5
2 8 7
1 9
2 10 9
1 9
2 6 6
2 1 1
2 3 3
1 9
2 7 4
 10 4 4
1 2
1 3
3 4
2 5
1 5
1 2
1 3
1 5
 10 7 7
1 2
1 3
2 4
2 5
4 6
5 7
3 8
2 4 7
2 6 4
1 2
2 10 3
1 9
1 8
1 8
 10 5 10
1 2
1 3
3 4
2 5
1 6
2 7 3
1 5
2 3 4
1 3
1 8
1 8
1 8
1 9
2 5 3
2 6 5
 10 1 14
1 2
1 1
1 8
1 9
2 2 5
1 9
1 6
2 10 9
2 4 8
1 4
2 1 10
2 2 4
1 10
2 8 10
2 7 4
 100 10 30
58 81
58 7
58 74
74 97
81 56
81 15
15 49
97 45
97 47
58 34
2 52 44
2 55 79
2 52 5
1 48
2 60 35
2 37 82
2 77 52
2 9 23
2 25 61
2 63 34
1 81
2 47 20
1 79
2 34 19
1 70
1 36
2 27 85
2 52 89
1 25
2 46 46
1 52
1 33
1 70
2 29 56
2 3 73
2 37 46
2 29 83
1 1
1 4
1 45
 10 8 43
1 2
2 3
3 4
2 5
1 6
3 7
7 8
3 9
2 1 6
2 2 8
1 8
2 2 6
1 8
2 1 7
2 9 5
2 9 4
2 7 10
2 10 3
2 1 5
2 6 9
2 6 10
2 3 3
1 1
2 7 5
2 6 2
2 2 5
2 3 9
1 3
2 8 7
1 9
1 3
2 6 9
1 7
1 10
2 10 3
2 10 2
2 5 7
2 10 5
1 10
1 7
1 10
1 2
1 6
2 3 10
1 3
1 5
1 6
1 5
1 8
1 7
2 5 8
 10 3 11
1 2
1 3
2 4
1 2
2 1 1
2 7 9
2 3 2
2 2 7
2 2 5
1 6
2 7 4
1 7
2 9 1
2 9 2
 10 5 6
1 2
2 3
2 4
4 5
1 6
2 3 1
2 6 4
2 1 1
1 5
1 6
1 4
 10 6 7
1 2
2 3
1 4
3 5
1 6
5 7
1 1
2 8 10
1 10
2 9 5
1 7
1 4
2 1 9
 100 16 46
36 42
36 50
42 54
42 74
50 58
42 16
50 81
50 96
42 62
54 2
74 75
74 22
2 48
50 95
74 66
75 5
1 62
1 56
2 6 68
1 47
1 43
1 38
1 75
2 22 82
2 56 77
1 71
2 52 15
2 9 1
2 12 59
1 24
2 41 94
2 18 58
2 22 67
1 45
2 68 70
1 81
1 48
1 71
2 76 28
2 31 73
2 58 80
2 100 57
2 88 79
1 30
2 96 23
2 92 44
1 12
1 66
1 24
2 71 68
2 4 4
2 84 43
2 80 15
2 54 13
1 51
2 99 17
1 63
2 12 41
2 1 2
2 62 96
2 79 9
2 59 79
 10 1 9
1 2
1 5
2 7 4
1 4
1 7
2 2 5
2 6 3
1 3
1 4
1 2
 10 5 77
1 2
1 3
3 4
1 5
5 6
1 2
2 3 10
2 5 1
1 2
1 4
2 7 7
2 7 9
1 7
2 4 9
2 2 4
2 3 2
2 5 2
2 10 1
2 3 8
1 9
1 4
1 2
2 8 3
2 8 2
2 2 3
2 5 9
1 10
2 3 10
2 5 9
1 2
1 7
1 4
1 4
1 3
1 4
1 10
2 8 7
1 2
2 3 1
1 10
2 7 7
1 2
1 5
1 3
1 8
2 7 7
1 10
2 4 2
1 9
2 6 6
1 3
1 2
2 8 10
1 1
1 7
2 10 7
1 8
1 9
2 1 4
2 1 1
2 3 3
1 9
1 8
2 9 4
1 4
2 4 4
1 6
2 9 4
2 5 10
1 4
2 8 9
1 10
1 4
1 4
1 10
1 2
1 4
1 7
2 10 8
1 2
2 6 6
2 8 5
 10 4 46
1 2
2 3
1 4
2 5
1 5
1 9
2 6 8
2 10 8
1 1
1 5
1 1
2 6 6
1 8
2 9 3
1 2
1 5
1 2
2 6 5
1 2
1 6
2 5 3
1 5
2 10 5
1 5
2 6 10
2 2 3
2 7 9
2 8 9
1 8
1 3
2 7 1
2 2 2
1 2
1 1
1 5
2 8 7
1 3
1 4
1 3
2 3 1
2 8 8
1 10
1 9
1 10
2 7 10
2 8 9
1 4
2 8 9
1 5
2 6 9
 10 7 26
1 2
2 3
3 4
3 5
4 6
2 7
5 8
2 7 10
1 3
2 8 5
2 9 4
2 5 1
1 5
1 8
1 10
1 3
1 9
1 6
2 1 9
2 5 7
2 1 4
1 6
2 6 7
1 3
1 1
1 3
1 2
2 8 3
2 2 5
1 1
2 7 7
2 5 1
2 1 8
 10 6 21
1 2
2 3
2 4
2 5
4 6
2 7
2 4 1
1 1
2 5 1
1 5
1 3
1 3
1 10
1 5
1 7
1 4
2 6 3
2 7 4
1 10
2 2 5
1 1
1 5
1 8
2 5 7
1 3
2 2 9
1 7

3
0
 2
2
2
 3
0
 4
4
4
0
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
 5
5
5
5
5
5
 4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
 0
9
0
0
 6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
 4
4
4
4
 5
0
5
5
 4
4
0
0
0
0
 1
0
0
0
0
1
4
 0
6
1
0
0
1
2
0
0
0
0
6
 5
5
5
5
5
5
5
5
5
5
5
5
5
5
5
5
5
5
5
 3
0
4
 4
4
4
 5
1
5
5
 6
0
0
0
0
6
0
0
0
6
6
0
0
1
6
0
0
0
 0
1
1
1
1
2
 4
4
4
1
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
 3
0
3
3
3
2
3
3
3
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
4
 4
4
4
4
4
4
4
4
4
4
4
4
4
 3
3
3
3
0
3
3
3
0
3
3
0
3
3

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

public class TestClass {

    static class Parser
    {
        final private int BUFFER_SIZE = 1 << 16;

        private DataInputStream din;
        private byte[] buffer;
        private int bufferPointer, bytesRead;

        public Parser(InputStream in)
        {
            din = new DataInputStream(in);
            buffer = new byte[BUFFER_SIZE];
            bufferPointer = bytesRead = 0;
        }

        public long nextLong() throws Exception
        {
            long ret = 0;
            byte c = read();
            while (c <= ' ') c = read();
            boolean neg = c == '-';
            if (neg) c = read();
            do
            {
                ret = ret * 10 + c - '0';
                c = read();
            } while (c > ' ');
            if (neg) return -ret;
            return ret;
        }

        //reads in the next string
        public String next() throws Exception
        {
            StringBuilder ret =  new StringBuilder();
            byte c = read();
            while (c <= ' ') c = read();
            do
            {
                ret = ret.append((char)c);
                c = read();
            } while (c > ' ');
            return ret.toString();
        }

        public int nextInt() throws Exception
        {
            int ret = 0;
            byte c = read();
            while (c <= ' ') c = read();
            boolean neg = c == '-';
            if (neg) c = read();
            do
            {
                ret = ret * 10 + c - '0';
                c = read();
            } while (c > ' ');
            if (neg) return -ret;
            return ret;
        }

        private void fillBuffer() throws Exception
        {
            bytesRead = din.read(buffer, bufferPointer = 0, BUFFER_SIZE);
            if (bytesRead == -1) buffer[0] = -1;
        }

        private byte read() throws Exception
        {
            if (bufferPointer == bytesRead) fillBuffer();
            return buffer[bufferPointer++];
        }
    }
    static class OutputWriter
    {
        private PrintWriter writer;

        public OutputWriter(OutputStream stream)
        {
            writer = new PrintWriter(new BufferedWriter(new OutputStreamWriter(
                    stream)));
        }

        public OutputWriter(Writer writer)
        {
            this.writer = new PrintWriter(writer);
        }

        public void println(int x)
        {
            writer.println(x);
        }

        public void print(int x)
        {
            writer.print(x);
        }

        public void println(char x)
        {
            writer.println(x);
        }

        public void print(char x)
        {
            writer.print(x);
        }

        public void println(int array[], int size)
        {
            for (int i = 0; i < size; i++)
                println(array[i]);
        }

        public void print(int array[], int size)
        {
            for (int i = 0; i < size; i++)
                print(array[i] + " ");
        }

        public void println(long x)
        {
            writer.println(x);
        }

        public void print(long x)
        {
            writer.print(x);
        }

        public void println(long array[], int size)
        {
            for (int i = 0; i < size; i++)
                println(array[i]);
        }

        public void print(long array[], int size)
        {
            for (int i = 0; i < size; i++)
                print(array[i]);
        }

        public void println(float num)
        {
            writer.println(num);
        }

        public void print(float num)
        {
            writer.print(num);
        }

        public void println(double num)
        {
            writer.println(num);
        }

        public void print(double num)
        {
            writer.print(num);
        }

        public void println(String s)
        {
            writer.println(s);
        }

        public void print(String s)
        {
            writer.print(s);
        }

        public void println()
        {
            writer.println();
        }

        public void printSpace()
        {
            writer.print(" ");
        }

        public void printf(String format, Object args)
        {
            writer.printf(format, args);
        }

        public void flush()
        {
            writer.flush();
        }

        public void close()
        {
            writer.close();
        }

    }
    static class Point{
        Long x;
        int i;
        //   boolean left;
        Point(long x,int i){
            this.x=x;
            this.i=i;
            //  this.left=left;

        }}
        static int len[];
    static ArrayList<Integer> list=new ArrayList<>();
    static int max=0;
    static int indx=-1;
        static class Graph {
                private int V;
                private LinkedList<Integer> adj[];
                Graph(int v) {
                    V = v;
                    adj = new LinkedList[v];
                    for (int i = 0; i < v; ++i)
                        adj[i] = new LinkedList();
                }
                void addEdge(int v, int w) {
                    adj[v].add(w);
                }
                void DFSUtil(int v, boolean visited[],int lev[]) {
                    visited[v] = true;
                  //  System.out.print(v + " ");
                    Iterator<Integer> i = adj[v].listIterator();
                    while (i.hasNext()) {
                        int n = i.next();
                        if (!visited[n]){
                            lev[n]=lev[v]+1;
                            if(max<lev[n]){
                                max=lev[n];
                                indx=n;
                            }
                            DFSUtil(n, visited,lev);}
                    }
                }
            void DFSUtil2(int v, boolean visited[],int lev[]) {
                visited[v] = true;
              //  System.out.print(v + " ");
                Iterator<Integer> i = adj[v].listIterator();
                while (i.hasNext()) {
                    int n = i.next();
                    if (!visited[n]){
                        lev[n]=lev[v]+1;
                        if(max<lev[n]){
                            max=lev[n];
                            indx=n;
                        }
                        DFSUtil2(n, visited,lev);}
                }
            }
                void DFS() {
                    boolean visited[] = new boolean[V];
                    int level[]=new int[V];
                    boolean visited2[] = new boolean[V];
                    int level2[]=new int[V];
                    for (int i = 0; i < V; ++i)
                        if (visited[i] == false){
                        indx=i;
                            max=0;
                            DFSUtil(i, visited, level);
                            max=0;
                            DFSUtil2(indx,visited2,level2);
                            len[indx]=max;
                            list.add(indx);
                    }
                }
                void bfs(){
                    int Visit[]=new int[V];
                    for (int i = 0; i <list.size(); i++) {
                        Queue<Integer> queue=new LinkedList<>();
                        int x=list.get(i);
                        queue.add(x);
                        Visit[i]=1;
                        while (!queue.isEmpty()){
                            int y=queue.poll();

                            Iterator<Integer> j=adj[y].listIterator();
                            while (j.hasNext()){
                                int n=j.next();
                                if(Visit[n]==0){
                                    Visit[n]=1;
                                    len[n]=len[x];
                                    queue.add(n);
                                }
                            }
                        }
                    }
                }
            }
            static int max(int a,int b,int c){
                int max=a;
                if(max<b)
                    max=b;
                if(max<c)
                    max=c;
              return max;

            }
    public static void main(String args[]) throws Exception {
        Parser s=new Parser(System.in);
        OutputWriter out=new OutputWriter(System.out);
        int N=s.nextInt();
        int M=s.nextInt();
        int Q=s.nextInt();
         len=new int[N];
        Graph g=new Graph(N);
        Initialize(N);
        for (int i = 0; i <M ; i++) {
            int x=s.nextInt()-1;
            int y=s.nextInt()-1;
            g.addEdge(x,y);
            g.addEdge(y,x);
            union(x,y);
        }
        g.DFS();
        g.bfs();
        while (Q-->0){
            int type=s.nextInt();
            if(type==1){
                int x=s.nextInt()-1;
                int root=root(x);
                System.out.println(len[root]);
            }
            else{
                int x=s.nextInt()-1;
                int y=s.nextInt()-1;
                int r1=root(x);
                int r2=root(y);
                int v=len[r1]/2+len[r2]/2+1;
                if(len[r1]%2!=0)
                    v++;
                if(len[r2]%2!=0)
                    v++;
                if(r1!=r2){
                union(r1,r2);
                int root=root(r1);
                len[root]=max(len[r1],len[r2],v);
                   // System.out.println(len[root]);
                }
            }
        }

    }
        static int size[];
        static int arr[];
        static   void Initialize(int N){
            arr=new int[N];
            size=new int[N];
            for(int i=0;i<N;i++){
                arr[i]=i;
                size[i]=1;
            }
        }
        static int root(int i){
            while(arr[i]!=i){
                arr[i]=arr[arr[i]];
                i=arr[i];
            }
            return i;
        }
        static void union(int A,int B){
            int rootA=root(A);
            int rootB=root(B);
            if(size[rootA]<size[rootB]){

                arr[rootA]=rootB;
                size[rootB]+=size[rootA];
            }
            else{
                arr[rootB]=rootA;
                size[rootA]+=size[rootB];
            }
        }
        static boolean find(int A,int B)
        {
            if( root(A)==root(B) )       //if A and B have the same root, it means that they are connected.
                return true;
            else
                return false;
        }

    }


