Problem: Ivan is a novice painter. He has n dyes of different colors. He also knows exactly m pairs of colors which harmonize with each other.

Ivan also enjoy playing chess. He has 5000 rooks. He wants to take k rooks, paint each of them in one of n colors and then place this k rooks on a chessboard of size 10^{9} × 10^{9}.

Let's call the set of rooks on the board connected if from any rook we can get to any other rook in this set moving only through cells with rooks from this set. Assume that rooks can jump over other rooks, in other words a rook can go to any cell which shares vertical and to any cell which shares horizontal.

Ivan wants his arrangement of rooks to have following properties:

  * For any color there is a rook of this color on a board;
  * For any color the set of rooks of this color is connected;
  * For any two different colors a b union of set of rooks of color a and set of rooks of color b is connected if and only if this two colors harmonize with each other.



Please help Ivan find such an arrangement.

Input

The first line of input contains 2 integers n, m (1 ≤ n ≤ 100, 0 ≤ m ≤ min(1000,    (n(n-1))/(2))) — number of colors and number of pairs of colors which harmonize with each other.

In next m lines pairs of colors which harmonize with each other are listed. Colors are numbered from 1 to n. It is guaranteed that no pair occurs twice in this list.

Output

Print n blocks, i-th of them describes rooks of i-th color.

In the first line of block print one number a_{i} (1 ≤ a_{i} ≤ 5000) — number of rooks of color i. In each of next a_{i} lines print two integers x and y (1 ≤ x,    y ≤ 10^{9}) — coordinates of the next rook.

All rooks must be on different cells.

Total number of rooks must not exceed 5000.

It is guaranteed that the solution exists.

Examples

Input

3 2
1 2
2 3


Output

2
3 4
1 4
4
1 2
2 2
2 4
5 4
1
5 1


Input

3 3
1 2
2 3
3 1


Output

1
1 1
1
1 2
1
1 3


Input

3 1
1 3


Output

1
1 1
1
2 2
1
3 1

Note

Rooks arrangements for all three examples (red is color 1, green is color 2 and blue is color 3).

<image>

<image>

<image>

Solution (in JAVA):

Solution:
import java.io.*;
import java.util.*;
import java.text.*;
import java.lang.*;
import java.lang.reflect.Array;
import java.math.BigInteger;
import java.util.regex.*;
public class Main {
         public static ArrayList a[]=new ArrayList[300001];
         public static ArrayList color[]=new ArrayList[300001];
		/*static long s[];
        static long[] seg=new long[4000000];
        static pair[] seg1=new pair[4000000];
        static long[] maxi=new long[4000000];
        static void build(int node,int start,int end) {
        	if(start==end) {
        		seg[node]=s[start];
        		return ;
        	}
        	int mid=(start+end)/2;
        	build(2*node+1,start,mid);
        	build(2*node+2,mid+1,end);
        	seg[node]=GCD(seg[2*node+1],seg[2*node+2]);
        }
        static void build1(int node,int start,int end) {
        	if(start==end) {
        		seg1[node]=new pair(s[start],1);
        		return ;
        	}
        	int mid=(start+end)/2;
        	build1(2*node+1,start,mid);
        	build1(2*node+2,mid+1,end);
        	if(seg1[2*node+1].x==seg1[2*node+2].x) {
        		seg1[node]=new pair(seg1[2*node+2].x,seg1[2*node+1].y+seg1[2*node+2].y);
        	}
        	else if(seg1[2*node+1].x<seg1[2*node+2].x)
        	{
        		seg1[node]=new pair(seg1[2*node+1].x,seg1[2*node+1].y);
        	}
        	else
        	{
        		seg1[node]=new pair(seg1[2*node+2].x,seg1[2*node+2].y);
        	}
        }
       /* static void update(int node,int start,int end,long l,int value) {
        	if(start==end) {
        		seg[node]+=value;
        		return ;
        	}
        	int mid=(start+end)/2;
        	if(start<=l && mid>=l)
        		update(2*node+1,start,mid,l,value);
        	else
        		update(2*node+2,mid+1,end,l,value);
        	seg[node]=seg[2*node+1]+seg[2*node+2];
        }*/
       
        /*static long query(int node,int start,int end,int l,int r) {
        	if(start>r || end<l)
        		return 0;
        	if(start>=l && end<=r)
        		return seg[node];
        	int mid=(start+end)/2;
        	return GCD(query(2*node+1,start,mid,l,r),query(2*node+2,mid+1,end,l,r));
        }
        static pair query1(int node,int start,int end,int l,int r) {
        	if(start>r || end<l)
        		return new pair(Long.MAX_VALUE,0);
        	if(start>=l && end<=r)
        		return seg1[node];
        	int mid=(start+end)/2;
        	pair p=query1(2*node+1,start,mid,l,r);
        	pair p1=query1(2*node+2,mid+1,end,l,r);
        	if(p.x==p1.x) {
        		return(new  pair(p.x,p.y+p1.y));
        	}
        	else if(p.x<p1.x)
        	{
        		return(p);
        	}
        	else
        	{
        		return(p1);
        	}
        }*/
	
         
		public static void main(String[] args) 
        {
            InputReader in = new InputReader(System.in);
            PrintWriter pw = new PrintWriter(System.out);
           int n=in.nextInt();
           int m=in.nextInt();
           for(int i=0;i<=n;i++) {
        	   a[i]=new ArrayList<Integer>();
        	   color[i]=new ArrayList<pair>();
           }
           boolean[][] visited=new boolean [n+1][n+1];
           for(int i=0;i<m;i++) {
        	   int x=in.nextInt();
        	   int y=in.nextInt();
        	   visited[x][y]=true;
        	   visited[y][x]=true;
        	   a[Math.min(x, y)].add(Math.max(x, y));
           }
           boolean[][] taken=new boolean [n+1][n+1];
           long  right=n+1;
           long below=n+1;
           
           for(int i=1;i<=n;i++) {
        	   for(int j=0;j<a[i].size();j++) {
        		   boolean chk=true;
        		   for(int k=1;k<i;k++) {
        			   if(taken[k][(int)a[i].get(j)] && visited[k][(int)a[i].get(j)]) {
        					chk=false;
        			   }
        		 }
        	   if(chk)
        	   {
        		   color[i].add(new pair(i,(int)a[i].get(j)));
        		   taken[i][(int)a[i].get(j)]=true;
        	   }
			   else
			   {
				   color[i].add(new pair(below,i));
				   color[(int)a[i].get(j)].add(new pair(below,(int)a[i].get(j)));
				   below++;
			   }
        	   }
           }
           for(int i=1;i<=n;i++) {
        	   pw.println(color[i].size()+1);
        	   pw.println(i+" "+i);
        	   for(int j=0;j<color[i].size();j++) {
        		   pw.println(color[i].get(j));
        	   }
           }
            pw.flush();
            pw.close();
        
        
        }
		private static void debug(Object... o) {
			System.out.println(Arrays.deepToString(o));
		}
        static class InputReader 
        {
        private final InputStream stream;
        private final byte[] buf = new byte[8192];
        private int curChar, snumChars;
        private SpaceCharFilter filter;
 
        public InputReader(InputStream stream) 
        {
            this.stream = stream;
        }
        public int snext() 
        {
            if (snumChars == -1)
                throw new InputMismatchException();
            if (curChar >= snumChars) 
            {
                curChar = 0;
                try 
                {
                    snumChars = stream.read(buf);
                } 
                
                catch (IOException e) 
                {
                    throw new InputMismatchException();
                }
                
                if (snumChars <= 0)
                    return -1;
            }
            return buf[curChar++];
        }
 
        public int nextInt() 
        {
            int c = snext();
            while (isSpaceChar(c)) 
            {
                c = snext();
            }
            int sgn = 1;
            if (c == '-')
            {
                sgn = -1;
                c = snext();
            }
            int res = 0;
            do 
            {
                if (c < '0' || c > '9')
                    throw new InputMismatchException();
                res *= 10;
                res += c - '0';
                c = snext();
            } while (!isSpaceChar(c));
            return res * sgn;
        }
 
        public long nextLong()
        {
            int c = snext();
            while (isSpaceChar(c)) 
            {
                c = snext();
            }
            int sgn = 1;
            if (c == '-') 
            {
                sgn = -1;
                c = snext();
            }
            long res = 0;
            do 
            {
                if (c < '0' || c > '9')
                    throw new InputMismatchException();
                res *= 10;
                res += c - '0';
                c = snext();
            } while (!isSpaceChar(c));
            return res * sgn;
        }
 
        public int[] nextIntArray(int n) 
        {
            int a[] = new int[n];
            for (int i = 0; i < n; i++) 
            {
                a[i] = nextInt();
            }
            return a;
        }
        static class tri implements Comparable<tri> {
            int p, c, l;
 
            tri(int p, int c, int l) {
                this.p = p;
                this.c = c;
                this.l = l;
            }
 
            public int compareTo(tri o) {
                return Integer.compare(l, o.l);
            }
        }
 
        public String readString()
        {
            int c = snext();
            while (isSpaceChar(c)) 
            {
                c = snext();
            }
            StringBuilder res = new StringBuilder();
            do 
            {
                res.appendCodePoint(c);
                c = snext();
            } while (!isSpaceChar(c));
            return res.toString();
        }
 
        public String nextLine() 
        {
            int c = snext();
            while (isSpaceChar(c))
                c = snext();
            StringBuilder res = new StringBuilder();
            do 
            {
                res.appendCodePoint(c);
                c = snext();
            } while (!isEndOfLine(c));
            return res.toString();
        }
 
        public boolean isSpaceChar(int c) 
        {
            if (filter != null)
                return filter.isSpaceChar(c);
            return c == ' ' || c == '\n' || c == '\r' || c == '\t' || c == -1;
        }
 
        private boolean isEndOfLine(int c) 
        {
            return c == '\n' || c == '\r' || c == -1;
        }
 
        public interface SpaceCharFilter
        {
            public boolean isSpaceChar(int ch);
        }
    }
        public static long mod = 1000000007;
        public static int d;
        public static int p;
        public static int q;
        
        public static int[] suffle(int[] a,Random gen)
        {
            int n = a.length;
            for(int i=0;i<n;i++)
            {
                int ind = gen.nextInt(n-i)+i;
                int temp = a[ind];
                a[ind] = a[i];
                a[i] = temp;
            }
            return a;
        }
        
        public static void swap(int a, int b){
            int temp = a;
            a = b;
            b = temp;
        }
        
        public static HashSet<Integer> primeFactorization(int n)
        {
            HashSet<Integer> a =new HashSet<Integer>();
            for(int i=2;i*i<=n;i++)
            {
                while(n%i==0)
                {
                    a.add(i);
                    n/=i;
                }
            }
            if(n!=1)
                a.add(n);
            return a;
        }
        
        public static void sieve(boolean[] isPrime,int n)
        {
            for(int i=1;i<n;i++)
                isPrime[i] = true;
            
            isPrime[0] = false;
            isPrime[1] = false;
            
            for(int i=2;i*i<n;i++)
            {
                if(isPrime[i] == true)
                {
                    for(int j=(2*i);j<n;j+=i)
                        isPrime[j] = false;
                }
            }
        }
        
        public static int GCD(int a,int b)
        {
            if(b==0)
                return a;
            else
                return GCD(b,a%b);
        }
        
        public static long GCD(long a,long b)
        {
            if(b==0)
                return a;
            else
                return GCD(b,a%b);
        }
        
        public static void extendedEuclid(int A,int B)
        {
            if(B==0)
            {
                d = A;
                p = 1 ;
                q = 0;
            }
            else
            {
                extendedEuclid(B, A%B);
                int temp = p;
                p = q;
                q = temp - (A/B)*q;
            }
        }
        
        public static long LCM(long a,long b)
        {
            return (a*b)/GCD(a,b);
        }
        
        public static int LCM(int a,int b)
        {
            return (a*b)/GCD(a,b);
        }
        
        public static int binaryExponentiation(int x,int n)
        {
            int result=1;
            while(n>0)
            {
                if(n % 2 ==1)
                    result=result * x;
                x=x*x;
                n=n/2;
            }
            return result;
        }
        
        public static long binaryExponentiation(long x,long n)
        {
            long result=1;
            while(n>0)
            {
                if(n % 2 ==1)
                    result=result * x;
                x=x*x;
                n=n/2;
            }
            return result;
        }
        
        public static int modularExponentiation(int x,int n,int M)
        {
            int result=1;
            while(n>0)
            {
                if(n % 2 ==1)
                    result=(result * x)%M;
                x=(x%M*x)%M;
                n=n/2;
            }
            return result;
        }
        
        public static long modularExponentiation(long x,long n,long M)
        {
            long result=1;
            while(n>0)
            {
                if(n % 2 ==1)
                    result=(result%M * x%M)%M;
                x=(x%M * x%M)%M;
                n=n/2;
            }
            return result;
        }
        
        public static long modInverse(int A,int M)
        {
            return modularExponentiation(A,M-2,M);
        }
        
        public static long modInverse(long A,long M)
        {
            return modularExponentiation(A,M-2,M);
        }
        
        public static boolean isPrime(int n)
        {
            
            if (n <= 1)  return false;
            if (n <= 3)  return true;
            
            if (n%2 == 0 || n%3 == 0) 
                return false;
         
            for (int i=5; i*i<=n; i=i+6)
            {
                if (n%i == 0 || n%(i+2) == 0)
                   return false;
            }
            
            return true;
        }
        
         public static long[] shuffle(long[] a, Random gen){ 
                for(int i = 0, n = a.length;i < n;i++){ 
                    int ind = gen.nextInt(n-i)+i; 
                    long d = a[i]; 
                    a[i] = a[ind]; 
                    a[ind] = d; 
                } 
                return a; 
            }
        static class pair implements Comparable<pair>
        {
            Long x;
            Long y;
            pair(long a,long sum)
            {
                this.x=a;
                this.y=sum;
            }
 

 
 
 
 
 
        public int compareTo(pair o) {
                int result = x.compareTo(o.x);
                if(result==0)
                    result = y.compareTo(o.y);
                
            return result;
            }  
            
            public String toString()
            {
                return x+" "+y;
            }
            
            public boolean equals(Object o)
            {
                if (o instanceof pair)
                {
                    pair p = (pair)o;
                    return p.x == x && p.y == y ;
                }
                return false;
            }
            
            public int hashCode()
            {
                return new Long(x).hashCode()*31 + new Long(y).hashCode();
            }
        }
       
 
      
}