CSES - Shared codeLink to this code: https://cses.fi/paste/cc989c0ccbfe2f2a10c465/
//package coding;

import java.io.*;
//import java.util.PriorityQueue;
import java.util.*;


public class Code {
	static class FastReader 
    { 
        BufferedReader br; 
        StringTokenizer st; 
  
        public FastReader() 
        { 
            br = new BufferedReader(new
                     InputStreamReader(System.in)); 
        } 
  
        String next() 
        { 
            while (st == null || !st.hasMoreElements()) 
            { 
                try
                { 
                    st = new StringTokenizer(br.readLine()); 
                } 
                catch (IOException  e) 
                { 
                    e.printStackTrace(); 
                } 
            } 
            return st.nextToken(); 
        } 
  
        int nextInt() 
        { 
            return Integer.parseInt(next()); 
        } 
  
        long nextLong() 
        { 
            return Long.parseLong(next()); 
        } 
  
        double nextDouble() 
        { 
            return Double.parseDouble(next()); 
        } 
  
        String nextLine() 
        { 
            String str = ""; 
            try
            { 
                str = br.readLine(); 
            } 
            catch (IOException e) 
            { 
                e.printStackTrace(); 
            } 
            return str; 
        } 
    } 
	static int n;
	static int m;
	static boolean visited[];
	static ArrayList<ArrayList<Integer>> arr;
    
	public static void main(String[]args)
        {
        	FastReader sc=new FastReader();
        	n=sc.nextInt();
        	m=sc.nextInt();
        	ArrayList<ArrayList<Integer>> arr=new ArrayList<ArrayList<Integer>>();
        	for(int i=0;i<n;i++) 
              {   ArrayList<Integer> a=new ArrayList<Integer>() ;
        			arr.add(a);
               }
        //	System.out.println(arr.get(0).size());
        	visited=new boolean[n];
        	for(int i=0;i<m;i++)
        	{
        		int f=sc.nextInt();
        		int s=sc.nextInt();
        		arr.get(f-1).add(s-1);
        		arr.get(s-1).add(f-1);
        	}
        	//System.out.println(arr.get(0).get(0));
        	int count=-1;
        	ArrayList<Integer> ans=new ArrayList<Integer>();
        	for(int i=0;i<n;i++)
        	{
        		if(!visited[i])
        		{
        	//		System.out.println(i+1);
        			count++;
        			dfs(i,arr);
        			ans.add(i+1);
        		}
        	}
        	System.out.println(ans.size()-1);
        	if(ans.size()>1)
        		for(int i=0;i<ans.size()-1;i++)
        		{
        			System.out.println(ans.get(i)+" "+ans.get(i+1));
        		}
        	
        }

	private static void dfs(int si, ArrayList<ArrayList<Integer>> arr) {
		// TODO Auto-generated method stub
          visited[si]=true;
		Stack<Integer> st=new Stack<Integer>();
		st.add(si);
		while(!st.isEmpty())
		{
			si=st.pop();
			for(int i=0;i<arr.get(si).size();i++)
				{
					int e=arr.get(si).get(i);
					if(!visited[e])
					{
						st.add(e);
						visited[e]=true;
					}
				}
			
		}
          
          
//		//System.out.println(arr.get(si).size());
//		for(int i=0;i<arr.get(si).size();i++)
//		{
//			int e=arr.get(si).get(i);
//			if(!visited[e])
//			{
//				dfs(e,arr);
//			}
//		}
		
	}

	
		
	
}