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

public class Template implements Runnable {

    BufferedReader in;
    PrintWriter out;
    StringTokenizer tok = new StringTokenizer("");

    void init() throws FileNotFoundException {
        try {
            in = new BufferedReader(new FileReader("input.txt"));
            out = new PrintWriter("output.txt");
        } catch (Exception e) {
            in = new BufferedReader(new InputStreamReader(System.in));
            out = new PrintWriter(System.out);
        }
    }

    String readString() throws IOException {
        while (!tok.hasMoreTokens()) {
            try {
                tok = new StringTokenizer(in.readLine(), " :");
            } catch (Exception e) {
                return null;
            }
        }
        return tok.nextToken();
    }

    int readInt() throws IOException {
        return Integer.parseInt(readString());
    }

    int[] readIntArray(int size) throws IOException {
        int[] res = new int[size];
        for (int i = 0; i < size; i++) {
            res[i] = readInt();
        }
        return res;
    }

    long readLong() throws IOException {
        return Long.parseLong(readString());
    }

    double readDouble() throws IOException {
        return Double.parseDouble(readString());
    }

    <T> List<T>[] createGraphList(int size) {
        List<T>[] list = new List[size];
        for (int i = 0; i < size; i++) {
            list[i] = new ArrayList<>();
        }
        return list;
    }

    public static void main(String[] args) {
        new Thread(null, new Template(), "", 1l * 200 * 1024 * 1024).start();
    }

    long timeBegin, timeEnd;

    void time() {
        timeEnd = System.currentTimeMillis();
        System.err.println("Time = " + (timeEnd - timeBegin));
    }

    long memoryTotal, memoryFree;

    void memory() {
        memoryFree = Runtime.getRuntime().freeMemory();
        System.err.println("Memory = " + ((memoryTotal - memoryFree) >> 10)
                + " KB");
    }

    public void run() {
        try {
            timeBegin = System.currentTimeMillis();
            memoryTotal = Runtime.getRuntime().freeMemory();
            init();
            solve();
            out.close();
            if (System.getProperty("ONLINE_JUDGE") == null) {
                time();
                memory();
            }
        } catch (Exception e) {
            e.printStackTrace();
            System.exit(-1);
        }
    }

    void solve() throws IOException {
        int n = readInt();
        int m = readInt();
        int min = Integer.MAX_VALUE;
        for (int i = 0; i < m; i++) {
            int l = readInt();
            int r = readInt();
            min = Math.min(min, r - l);
        }
        out.println(min + 1);
        for (int i=0;i<n;i++) {
            out.println(i % (min + 1));
        }
    }

}


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

public class code1
		{

			public static int n, m;

			public static long[][] cnt;
			public static void main(String[] args)
			{
				InputReader in = new InputReader(System.in);
				PrintWriter pw = new PrintWriter(System.out);

				//Code starts..

				int n = in.nextInt();
				int m  = in.nextInt();
				int[][] a = new int[m][2];
				pair[] p = new pair[m];

				for(int i=0; i<m; i++)
				{
					int l = in.nextInt()-1;
					int r = in.nextInt()-1;
					p[i] = new pair(r-l, i);
					a[i][0] = l;
					a[i][1] = r;
				}

				Arrays.sort(p);
				int[] ans = new int[n];
				int ans2 = -1;
				for(int i=0; i<m; i++)
				{
					int pr = (int)(long)p[i].y;
					int l = a[pr][0];
					int r = a[pr][1];
					if(i==0)
						ans2 = r-l+1;

					int cnt = 0;
					for(int j=l; j<=r; j++)
						if(ans[j]==0)
							ans[j] = cnt++;

				}
				pw.println(ans2);
				for(int i=0; i<n; i++)
					pw.print(ans[i]+" ");

				//Code ends....

				pw.flush();
				pw.close();
				return;
			}

			public static int alternateSubarray(int arr[], int n)
			{
				int count = 1;
				int prev = arr[0];
			    int max = 0;
				for (int i = 1; i < n; ++i) {

			        if (arr[i] == prev)
			        {
			        	while (count>0)
			        		count--;
			        		//	System.out.print(count--+" ");

			        }

			        ++count;
			        max = Math.max(max, count);

			        prev = arr[i];
				}

				return max;
			}

			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;
				}

				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 c = 0;

			public static long mod = 1000000007;
			public static int d;
			public static int p;
			public static int q;
			public static boolean flag;
			public static long INF= Long.MAX_VALUE;

			public static long fun(int[] a, int[] b, int m,int n) {
				long result =0;
				for(int i=0; i<m; i++)
					for(int j=0; j<m; j++)
					{
						long[] fib  = new long[Math.max(2, n+2)];
						fib[1] = a[i];
						fib[2] = b[j];
						for(int k=3; k<=n; k++)
							fib[k] = (fib[k-1]%mod + fib[k-2]%mod)%mod;
						result = (result%mod + fib[n]%mod)%mod;
					}

				return result;

			}

			public static double slope(pair p1, pair p2)
			{
				double m = INF;
				if((p1.x - p2.x)!=0)
				m =  (p1.y - p2.y)/(p1.x - p2.x);

				return Math.abs(m);

			}

			public static int count(String[] s, int f)
			{
				int count = 0;
				int n = s[0].length();

				if(f==1)
				{
				for(int i = 0; i<n; i++)
				{
					for(int j=0; j<n; j++)
					{
						if(i%2==0)
						{
							if(j%2==0 && s[i].charAt(j)=='0')
								count++;
							if(j%2==1 && s[i].charAt(j)=='1')
								count++;
						}
						if(i%2==1)
						{
							if(j%2==1 && s[i].charAt(j)=='0')
								count++;
							if(j%2==0 && s[i].charAt(j)=='1')
								count++;
						}

					}
				}
				}
				else
				{

				 count = 0;

				for(int i = 0; i<n; i++)
				{
					for(int j=0; j<n; j++)
					{
						if(i%2==1)
						{
							if(j%2==0 && s[i].charAt(j)=='0')
								count++;
							if(j%2==1 && s[i].charAt(j)=='1')
								count++;
						}
						if(i%2==0)
						{
							if(j%2==1 && s[i].charAt(j)=='0')
								count++;
							if(j%2==0 && s[i].charAt(j)=='1')
								count++;
						}

					}
				}

				}

				return count;

			}

			public static  int gcd(int p2, int p22)
			{
			    if (p2 == 0)
			        return (int) p22;
			    return gcd(p22%p2, p2);
			}

			public static int findGCD(int arr[], int n)
			{
			    int result = arr[0];
			    for (int i=1; i<n; i++)
			        result = gcd(arr[i], result);

			    return result;
			}

			public static void nextGreater(long[] a, int[] ans)
			{

				Stack<Integer> stk = new Stack<>();
				stk.push(0);

				for(int i=1; i<a.length; i++)
				{

					if(!stk.isEmpty())
					{
					int s = stk.pop();
					while(a[s]<a[i])
					{
						ans[s] = i;
						if(!stk.isEmpty())
							s = stk.pop();
						else
							break;
					}
					if(a[s]>=a[i])
						stk.push(s);
					}

					stk.push(i);

				}
				return;

			}

			public static void nextGreaterRev(long[] a, int[] ans)
			{

				int n = a.length;
				int[] pans = new int[n];
				Arrays.fill(pans, -1);
				long[] arev = new long[n];
				for(int i=0; i<n; i++)
					arev[i] = a[n-1-i];

				Stack<Integer> stk = new Stack<>();
				stk.push(0);

				for(int i=1; i<n; i++)
				{

					if(!stk.isEmpty())
					{
					int s = stk.pop();
					while(arev[s]<arev[i])
					{
						pans[s] = n - i-1;
						if(!stk.isEmpty())
							s = stk.pop();
						else
							break;
					}
					if(arev[s]>=arev[i])
						stk.push(s);
					}

					stk.push(i);

				}

				//for(int i=0; i<n; i++)
					//System.out.print(pans[i]+" ");

				for(int i=0; i<n; i++)
					ans[i] = pans[n-i-1];

				return;

			}

			public static void nextSmaller(long[] a, int[] ans)
			{

				Stack<Integer> stk = new Stack<>();
				stk.push(0);

				for(int i=1; i<a.length; i++)
				{

					if(!stk.isEmpty())
					{
					int s = stk.pop();
					while(a[s]>a[i])
					{
						ans[s] = i;
						if(!stk.isEmpty())
							s = stk.pop();
						else
							break;
					}
					if(a[s]<=a[i])
						stk.push(s);
					}

					stk.push(i);

				}
				return;

			}

			public static void print(int[] a)
			{
				PrintWriter pw = new PrintWriter(System.out);
				for(int i=0; i<a.length; i++)
					pw.print(a[i]+" ");

				pw.println();
				pw.flush();
				pw.close();

			}

			public static void print(long[] a)
			{
				PrintWriter pw = new PrintWriter(System.out);
				for(int i=0; i<a.length; i++)
					pw.print(a[i]+" ");

				pw.println();
				pw.flush();
				pw.close();

			}

		    public static long lcm(int[] numbers) {
		        long lcm = 1;
		        int divisor = 2;
		        while (true) {
		            int cnt = 0;
		            boolean divisible = false;
		            for (int i = 0; i < numbers.length; i++) {
		                if (numbers[i] == 0) {
		                    return 0;
		                } else if (numbers[i] < 0) {
		                    numbers[i] = numbers[i] * (-1);
		                }
		                if (numbers[i] == 1) {
		                    cnt++;
		                }
		                if (numbers[i] % divisor == 0) {
		                    divisible = true;
		                    numbers[i] = numbers[i] / divisor;
		                }
		            }
		            if (divisible) {
		                lcm = lcm * divisor;
		            } else {
		                divisor++;
		            }
		            if (cnt == numbers.length) {
		                return lcm;
		            }
		        }
		    }
			public static long fact(long n) {

				long factorial = 1;
				 for(int i = 1; i <= n; i++)
			        {
			            factorial *= i;
			        }
				 return factorial;
			}

	public static void factSieve(int[] a, int n) {

				for(int i=2; i<=n; i+=2)
					a[i] = 2;

				for(int i=3; i<=n; i+=2)
				{
					if(a[i]==0)
					{
						a[i] = i;

						for(int j=i; j*i<=n; j++)
						{
							a[i*j] = i;
						}
					}
				}

				int k = 1000;
				while(k!=1)
				{
					System.out.print(a[k]+" ");
					k /= a[k];

				}
			}

			public static int lowerLimit(int[] a, int n) {
				int ans = 0;

				int ll = 0;
				int rl = a.length-1;
			//	System.out.println(a[rl]+" "+n);
				if(a[0]>n)
					return 0;
				if(a[0]==n)
					return 1;
				else if(a[rl]<=n)
					return rl+1;

				while(ll<=rl)
				{

					int mid = (ll+rl)/2;
					if(a[mid]==n)
					{
						ans = mid + 1;
						break;
					}

					else if(a[mid]>n)
					{
						rl = mid-1;

					}
					else
					{
						ans = mid+1;
						ll = mid+1;
					}
				}

				return ans;
			}

			public static long choose(long total, long choose){
			    if(total < choose)
			        return 0;
			    if(choose == 0 || choose == total)
			        return 1;
			    return (choose(total-1,choose-1)+choose(total-1,choose))%mod;
			}

			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 long[] sort(long[] a)
			{
				Random gen = new Random();
				int n = a.length;
				for(int i=0;i<n;i++)
				{
					int ind = gen.nextInt(n-i)+i;
					long temp = a[ind];
					a[ind] = a[i];
					a[i] = temp;
				}

				Arrays.sort(a);
				return a;
			}

			public static pair[] sort(pair[] a)
			{
				Random gen = new Random();
				int n = a.length;
				for(int i=0;i<n;i++)
				{
					int ind = gen.nextInt(n-i)+i;
					pair temp = a[ind];
					a[ind] = a[i];
					a[i] = temp;
				}

				Arrays.sort(a);
				return a;
			}

			public static int[] sort(int[] a)
			{
				Random gen = new Random();
				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;
				}

				Arrays.sort(a);
				return a;
			}

			public static int floorSearch(int arr[], int low, int high, int x)
			{
			    if (low > high)
			        return -1;

			    if (x > arr[high])
			        return high;
			    int mid = (low+high)/2;

			    if (mid > 0 && arr[mid-1] < x && x < arr[mid])
			        return mid-1;

			    if (x < arr[mid])
			        return floorSearch(arr, low, mid-1, x);

			    return floorSearch(arr, mid+1, high, x);
			}

			public static void swap(int a, int b){
				int temp = a;
				a = b;
				b = temp;
			}
			public static ArrayList<Integer> primeFactorization(int n)
			{
				ArrayList<Integer> a =new ArrayList<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 lowerbound(ArrayList<Long> net, long c2) {
				int i=Collections.binarySearch(net, c2);
				if(i<0)
					i = -(i+2);
				return i;

			}

			public static int lowerboundArray(long[] psum, long c2) {
				int i=Arrays.binarySearch(psum, c2);
				if(i<0)
					i = -(i+2);
				return i;

			}

			public static int lowerboundArray(int[] psum, int c2) {
				int i=Arrays.binarySearch(psum, c2);
				if(i<0)
					i = -(i+2);
				return i;

			}

			public static int uperboundArray(long[] psum, long c2) {
				int i=Arrays.binarySearch(psum, c2);
				if(i<0)
					i = -(i+1);
				return i;

			}

			public static int uperbound(ArrayList<Long> net, long c2) {
				int i=Collections.binarySearch(net, c2);
				if(i<0)
					i = -(i+1);
				return i;

			}

			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 int[] countDer(int n)
		    {
		        int der[] = new int[n + 1];

		        der[0] = 1;
		        der[1] = 0;
		        der[2] = 1;

		        for (int i = 3; i <= n; ++i)
		            der[i] = (i - 1) * (der[i - 1] + der[i - 2]);

		        // Return result for n
		        return der;
		    }

			 static long binomialCoeff(int n, int k)
			    {
			    long C[][] = new long[n+1][k+1];
			    int i, j;

			        // Calculate  value of Binomial Coefficient in bottom up manner
			    for (i = 0; i <= n; i++)
			    {
			        for (j = 0; j <= Math.min(i, k); j++)
			        {
			            // Base Cases
			            if (j == 0 || j == i)
			                C[i][j] = 1;

			            // Calculate value using previosly stored values
			            else
			                C[i][j] = C[i-1][j-1] + C[i-1][j];
			          }
			     }

			    return C[n][k];
			    }

			public static long binaryExponentiation(long x,long n)
			{
			    long result=1;
			    while(n>0)
			    {
			        if(n % 2 ==1)
			            result=result * x;
			        x=(x%mod * x%mod)%mod;
			        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)%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*x)%M;
			        n=n/2;
			    }
			    return result;
			}

			public static int 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 checkYear(int year)
		    {
				if (year % 400 == 0)
		            return true;

		        if (year % 100 == 0)
		            return false;

		        if (year % 4 == 0)
		            return true;
		        return false;
		    }

			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;
			}

			static class pair implements Comparable<pair>

			{
				Long x, y;

				pair(long x, long y) {
					this.x = x;
					this.y = y;
				}

				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;
						if(p.x-x==0 && p.y-y==0)
							return true;
						else
						return false;
					}
					return false;
				}

				public int hashCode() {
					return new Long(x).hashCode() * 31 + new Long(y).hashCode();
				}

			}

			static class triplet implements Comparable<triplet>
			{
				Integer x,y;
				Long z;
				triplet(Integer l,Integer m,long z)
				{
					this.x = l;
					this.y = m;
					this.z = z;
				}

				public  int compareTo(triplet o)
				{
					int result = x.compareTo(o.x);
					if(result==0)
						result =  y.compareTo(o.y);
					if(result==0)
						result = z.compareTo(o.z);

					return result;
				}

				public boolean equlas(Object o)
				{
					if(o instanceof triplet)
					{
						triplet p = (triplet)o;
						return x==p.x && y==p.y && z==p.z;
					}
					return false;
				}

				public String toString()
				{
					return x+" "+y+" "+z;
				}
				public int hashCode()
				{
					return new Long(x).hashCode()*31 + new Long(y).hashCode() + new Long(z).hashCode();
				}
			}

			static class spair implements Comparable<spair>

			{
				String x;
				Integer y;

				spair(String x, int y) {
					this.x = x;
					this.y = y;
				}

				public int compareTo(spair o) {

					String s1 = x + o.x;
					String s2 = o.x + x;
					long p1 = cnt[y][0] + cnt[o.y][0];
					long p2 = p1;

					p1 += cnt[y][1] * cnt[o.y][2];
					p2 += cnt[o.y][1] * cnt[y][2];

					if(p1==p2)
							return 0;
					if(p1>p2)
						return -1;

					return 1;

				}

				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();
				}

			}

			/*static class node implements Comparable<node>

			{
				Integer x, y, z;
				node(int x,int y, int z)
				{
					this.x=x;
					this.y=y;
					this.z=z;
				}

				public int compareTo(pair o) {
					int result = x.compareTo(o.x);
					if(result==0)
						result = y.compareTo(o.y);
					if(result==0)
						result = z.compareTo(z);
					return result;
				}

				@Override
				public int compareTo(node o) {
					// TODO Auto-generated method stub
					return 0;
				}
			}
			*/
		}
		}


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

public class code1
		{

			public static int n, m;

			public static long[][] cnt;
			public static void main(String[] args)
			{
				InputReader in = new InputReader(System.in);
				PrintWriter pw = new PrintWriter(System.out);

				//Code starts..

				int n = in.nextInt();
				int m  = in.nextInt();
				int[][] a = new int[m][2];
				pair[] p = new pair[m];

				for(int i=0; i<m; i++)
				{
					int l = in.nextInt()-1;
					int r = in.nextInt()-1;
					p[i] = new pair(r-l, i);
					a[i][0] = l;
					a[i][1] = r;
				}

				Arrays.sort(p);
				int[] ans = new int[n];
				Arrays.fill(ans, -1);
				int ans2 = -1;
				for(int i=0; i<m; i++)
				{
					int pr = (int)(long)p[i].y;
					int l = a[pr][0];
					int r = a[pr][1];
					if(i==0)
						ans2 = r-l+1;

					int cnt = 0;
					for(int j=l; j<=r; j++)
						if(ans[j]==-1)
							ans[j] = cnt++;

				}
				pw.println(ans2);
				for(int i=0; i<n; i++)
					pw.print(ans[i]+" ");

				//Code ends....

				pw.flush();
				pw.close();
				return;
			}

			public static int alternateSubarray(int arr[], int n)
			{
				int count = 1;
				int prev = arr[0];
			    int max = 0;
				for (int i = 1; i < n; ++i) {

			        if (arr[i] == prev)
			        {
			        	while (count>0)
			        		count--;
			        		//	System.out.print(count--+" ");

			        }

			        ++count;
			        max = Math.max(max, count);

			        prev = arr[i];
				}

				return max;
			}

			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;
				}

				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 c = 0;

			public static long mod = 1000000007;
			public static int d;
			public static int p;
			public static int q;
			public static boolean flag;
			public static long INF= Long.MAX_VALUE;

			public static long fun(int[] a, int[] b, int m,int n) {
				long result =0;
				for(int i=0; i<m; i++)
					for(int j=0; j<m; j++)
					{
						long[] fib  = new long[Math.max(2, n+2)];
						fib[1] = a[i];
						fib[2] = b[j];
						for(int k=3; k<=n; k++)
							fib[k] = (fib[k-1]%mod + fib[k-2]%mod)%mod;
						result = (result%mod + fib[n]%mod)%mod;
					}

				return result;

			}

			public static double slope(pair p1, pair p2)
			{
				double m = INF;
				if((p1.x - p2.x)!=0)
				m =  (p1.y - p2.y)/(p1.x - p2.x);

				return Math.abs(m);

			}

			public static int count(String[] s, int f)
			{
				int count = 0;
				int n = s[0].length();

				if(f==1)
				{
				for(int i = 0; i<n; i++)
				{
					for(int j=0; j<n; j++)
					{
						if(i%2==0)
						{
							if(j%2==0 && s[i].charAt(j)=='0')
								count++;
							if(j%2==1 && s[i].charAt(j)=='1')
								count++;
						}
						if(i%2==1)
						{
							if(j%2==1 && s[i].charAt(j)=='0')
								count++;
							if(j%2==0 && s[i].charAt(j)=='1')
								count++;
						}

					}
				}
				}
				else
				{

				 count = 0;

				for(int i = 0; i<n; i++)
				{
					for(int j=0; j<n; j++)
					{
						if(i%2==1)
						{
							if(j%2==0 && s[i].charAt(j)=='0')
								count++;
							if(j%2==1 && s[i].charAt(j)=='1')
								count++;
						}
						if(i%2==0)
						{
							if(j%2==1 && s[i].charAt(j)=='0')
								count++;
							if(j%2==0 && s[i].charAt(j)=='1')
								count++;
						}

					}
				}

				}

				return count;

			}

			public static  int gcd(int p2, int p22)
			{
			    if (p2 == 0)
			        return (int) p22;
			    return gcd(p22%p2, p2);
			}

			public static int findGCD(int arr[], int n)
			{
			    int result = arr[0];
			    for (int i=1; i<n; i++)
			        result = gcd(arr[i], result);

			    return result;
			}

			public static void nextGreater(long[] a, int[] ans)
			{

				Stack<Integer> stk = new Stack<>();
				stk.push(0);

				for(int i=1; i<a.length; i++)
				{

					if(!stk.isEmpty())
					{
					int s = stk.pop();
					while(a[s]<a[i])
					{
						ans[s] = i;
						if(!stk.isEmpty())
							s = stk.pop();
						else
							break;
					}
					if(a[s]>=a[i])
						stk.push(s);
					}

					stk.push(i);

				}
				return;

			}

			public static void nextGreaterRev(long[] a, int[] ans)
			{

				int n = a.length;
				int[] pans = new int[n];
				Arrays.fill(pans, -1);
				long[] arev = new long[n];
				for(int i=0; i<n; i++)
					arev[i] = a[n-1-i];

				Stack<Integer> stk = new Stack<>();
				stk.push(0);

				for(int i=1; i<n; i++)
				{

					if(!stk.isEmpty())
					{
					int s = stk.pop();
					while(arev[s]<arev[i])
					{
						pans[s] = n - i-1;
						if(!stk.isEmpty())
							s = stk.pop();
						else
							break;
					}
					if(arev[s]>=arev[i])
						stk.push(s);
					}

					stk.push(i);

				}

				//for(int i=0; i<n; i++)
					//System.out.print(pans[i]+" ");

				for(int i=0; i<n; i++)
					ans[i] = pans[n-i-1];

				return;

			}

			public static void nextSmaller(long[] a, int[] ans)
			{

				Stack<Integer> stk = new Stack<>();
				stk.push(0);

				for(int i=1; i<a.length; i++)
				{

					if(!stk.isEmpty())
					{
					int s = stk.pop();
					while(a[s]>a[i])
					{
						ans[s] = i;
						if(!stk.isEmpty())
							s = stk.pop();
						else
							break;
					}
					if(a[s]<=a[i])
						stk.push(s);
					}

					stk.push(i);

				}
				return;

			}

			public static void print(int[] a)
			{
				PrintWriter pw = new PrintWriter(System.out);
				for(int i=0; i<a.length; i++)
					pw.print(a[i]+" ");

				pw.println();
				pw.flush();
				pw.close();

			}

			public static void print(long[] a)
			{
				PrintWriter pw = new PrintWriter(System.out);
				for(int i=0; i<a.length; i++)
					pw.print(a[i]+" ");

				pw.println();
				pw.flush();
				pw.close();

			}

		    public static long lcm(int[] numbers) {
		        long lcm = 1;
		        int divisor = 2;
		        while (true) {
		            int cnt = 0;
		            boolean divisible = false;
		            for (int i = 0; i < numbers.length; i++) {
		                if (numbers[i] == 0) {
		                    return 0;
		                } else if (numbers[i] < 0) {
		                    numbers[i] = numbers[i] * (-1);
		                }
		                if (numbers[i] == 1) {
		                    cnt++;
		                }
		                if (numbers[i] % divisor == 0) {
		                    divisible = true;
		                    numbers[i] = numbers[i] / divisor;
		                }
		            }
		            if (divisible) {
		                lcm = lcm * divisor;
		            } else {
		                divisor++;
		            }
		            if (cnt == numbers.length) {
		                return lcm;
		            }
		        }
		    }
			public static long fact(long n) {

				long factorial = 1;
				 for(int i = 1; i <= n; i++)
			        {
			            factorial *= i;
			        }
				 return factorial;
			}

	public static void factSieve(int[] a, int n) {

				for(int i=2; i<=n; i+=2)
					a[i] = 2;

				for(int i=3; i<=n; i+=2)
				{
					if(a[i]==0)
					{
						a[i] = i;

						for(int j=i; j*i<=n; j++)
						{
							a[i*j] = i;
						}
					}
				}

				int k = 1000;
				while(k!=1)
				{
					System.out.print(a[k]+" ");
					k /= a[k];

				}
			}

			public static int lowerLimit(int[] a, int n) {
				int ans = 0;

				int ll = 0;
				int rl = a.length-1;
			//	System.out.println(a[rl]+" "+n);
				if(a[0]>n)
					return 0;
				if(a[0]==n)
					return 1;
				else if(a[rl]<=n)
					return rl+1;

				while(ll<=rl)
				{

					int mid = (ll+rl)/2;
					if(a[mid]==n)
					{
						ans = mid + 1;
						break;
					}

					else if(a[mid]>n)
					{
						rl = mid-1;

					}
					else
					{
						ans = mid+1;
						ll = mid+1;
					}
				}

				return ans;
			}

			public static long choose(long total, long choose){
			    if(total < choose)
			        return 0;
			    if(choose == 0 || choose == total)
			        return 1;
			    return (choose(total-1,choose-1)+choose(total-1,choose))%mod;
			}

			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 long[] sort(long[] a)
			{
				Random gen = new Random();
				int n = a.length;
				for(int i=0;i<n;i++)
				{
					int ind = gen.nextInt(n-i)+i;
					long temp = a[ind];
					a[ind] = a[i];
					a[i] = temp;
				}

				Arrays.sort(a);
				return a;
			}

			public static pair[] sort(pair[] a)
			{
				Random gen = new Random();
				int n = a.length;
				for(int i=0;i<n;i++)
				{
					int ind = gen.nextInt(n-i)+i;
					pair temp = a[ind];
					a[ind] = a[i];
					a[i] = temp;
				}

				Arrays.sort(a);
				return a;
			}

			public static int[] sort(int[] a)
			{
				Random gen = new Random();
				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;
				}

				Arrays.sort(a);
				return a;
			}

			public static int floorSearch(int arr[], int low, int high, int x)
			{
			    if (low > high)
			        return -1;

			    if (x > arr[high])
			        return high;
			    int mid = (low+high)/2;

			    if (mid > 0 && arr[mid-1] < x && x < arr[mid])
			        return mid-1;

			    if (x < arr[mid])
			        return floorSearch(arr, low, mid-1, x);

			    return floorSearch(arr, mid+1, high, x);
			}

			public static void swap(int a, int b){
				int temp = a;
				a = b;
				b = temp;
			}
			public static ArrayList<Integer> primeFactorization(int n)
			{
				ArrayList<Integer> a =new ArrayList<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 lowerbound(ArrayList<Long> net, long c2) {
				int i=Collections.binarySearch(net, c2);
				if(i<0)
					i = -(i+2);
				return i;

			}

			public static int lowerboundArray(long[] psum, long c2) {
				int i=Arrays.binarySearch(psum, c2);
				if(i<0)
					i = -(i+2);
				return i;

			}

			public static int lowerboundArray(int[] psum, int c2) {
				int i=Arrays.binarySearch(psum, c2);
				if(i<0)
					i = -(i+2);
				return i;

			}

			public static int uperboundArray(long[] psum, long c2) {
				int i=Arrays.binarySearch(psum, c2);
				if(i<0)
					i = -(i+1);
				return i;

			}

			public static int uperbound(ArrayList<Long> net, long c2) {
				int i=Collections.binarySearch(net, c2);
				if(i<0)
					i = -(i+1);
				return i;

			}

			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 int[] countDer(int n)
		    {
		        int der[] = new int[n + 1];

		        der[0] = 1;
		        der[1] = 0;
		        der[2] = 1;

		        for (int i = 3; i <= n; ++i)
		            der[i] = (i - 1) * (der[i - 1] + der[i - 2]);

		        // Return result for n
		        return der;
		    }

			 static long binomialCoeff(int n, int k)
			    {
			    long C[][] = new long[n+1][k+1];
			    int i, j;

			        // Calculate  value of Binomial Coefficient in bottom up manner
			    for (i = 0; i <= n; i++)
			    {
			        for (j = 0; j <= Math.min(i, k); j++)
			        {
			            // Base Cases
			            if (j == 0 || j == i)
			                C[i][j] = 1;

			            // Calculate value using previosly stored values
			            else
			                C[i][j] = C[i-1][j-1] + C[i-1][j];
			          }
			     }

			    return C[n][k];
			    }

			public static long binaryExponentiation(long x,long n)
			{
			    long result=1;
			    while(n>0)
			    {
			        if(n % 2 ==1)
			            result=result * x;
			        x=(x%mod * x%mod)%mod;
			        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)%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*x)%M;
			        n=n/2;
			    }
			    return result;
			}

			public static int 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 checkYear(int year)
		    {
				if (year % 400 == 0)
		            return true;

		        if (year % 100 == 0)
		            return false;

		        if (year % 4 == 0)
		            return true;
		        return false;
		    }

			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;
			}

			static class pair implements Comparable<pair>

			{
				Long x, y;

				pair(long x, long y) {
					this.x = x;
					this.y = y;
				}

				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;
						if(p.x-x==0 && p.y-y==0)
							return true;
						else
						return false;
					}
					return false;
				}

				public int hashCode() {
					return new Long(x).hashCode() * 31 + new Long(y).hashCode();
				}

			}

			static class triplet implements Comparable<triplet>
			{
				Integer x,y;
				Long z;
				triplet(Integer l,Integer m,long z)
				{
					this.x = l;
					this.y = m;
					this.z = z;
				}

				public  int compareTo(triplet o)
				{
					int result = x.compareTo(o.x);
					if(result==0)
						result =  y.compareTo(o.y);
					if(result==0)
						result = z.compareTo(o.z);

					return result;
				}

				public boolean equlas(Object o)
				{
					if(o instanceof triplet)
					{
						triplet p = (triplet)o;
						return x==p.x && y==p.y && z==p.z;
					}
					return false;
				}

				public String toString()
				{
					return x+" "+y+" "+z;
				}
				public int hashCode()
				{
					return new Long(x).hashCode()*31 + new Long(y).hashCode() + new Long(z).hashCode();
				}
			}

			static class spair implements Comparable<spair>

			{
				String x;
				Integer y;

				spair(String x, int y) {
					this.x = x;
					this.y = y;
				}

				public int compareTo(spair o) {

					String s1 = x + o.x;
					String s2 = o.x + x;
					long p1 = cnt[y][0] + cnt[o.y][0];
					long p2 = p1;

					p1 += cnt[y][1] * cnt[o.y][2];
					p2 += cnt[o.y][1] * cnt[y][2];

					if(p1==p2)
							return 0;
					if(p1>p2)
						return -1;

					return 1;

				}

				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();
				}

			}

			/*static class node implements Comparable<node>

			{
				Integer x, y, z;
				node(int x,int y, int z)
				{
					this.x=x;
					this.y=y;
					this.z=z;
				}

				public int compareTo(pair o) {
					int result = x.compareTo(o.x);
					if(result==0)
						result = y.compareTo(o.y);
					if(result==0)
						result = z.compareTo(z);
					return result;
				}

				@Override
				public int compareTo(node o) {
					// TODO Auto-generated method stub
					return 0;
				}
			}
			*/
		}
		}


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

public class code1
		{

			public static int n, m;

			public static long[][] cnt;
			public static void main(String[] args)
			{
				InputReader in = new InputReader(System.in);
				PrintWriter pw = new PrintWriter(System.out);

				//Code starts..

				int n = in.nextInt();
				int m  = in.nextInt();
				int[][] a = new int[m][2];
				pair[] p = new pair[m];

				for(int i=0; i<m; i++)
				{
					int l = in.nextInt()-1;
					int r = in.nextInt()-1;
					p[i] = new pair(r-l, i);
					a[i][0] = l;
					a[i][1] = r;
				}

				Arrays.sort(p);
				int[] ans = new int[n];
				Arrays.fill(ans, -1);
				int ans2 = -1;
				for(int i=0; i<m; i++)
				{
					int pr = (int)(long)p[i].y;
					int l = a[pr][0];
					int r = a[pr][1];
					if(i==0)
						ans2 = r-l+1;

				}
				int k = 0;
				pw.println(ans2);
				for(int i=0; i<n; i++)
				{
					pw.print(k+" ");
					k++;
					if(k==ans2)
						k = 0;
				}

				//Code ends....

				pw.flush();
				pw.close();
				return;
			}

			public static int alternateSubarray(int arr[], int n)
			{
				int count = 1;
				int prev = arr[0];
			    int max = 0;
				for (int i = 1; i < n; ++i) {

			        if (arr[i] == prev)
			        {
			        	while (count>0)
			        		count--;
			        		//	System.out.print(count--+" ");

			        }

			        ++count;
			        max = Math.max(max, count);

			        prev = arr[i];
				}

				return max;
			}

			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;
				}

				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 c = 0;

			public static long mod = 1000000007;
			public static int d;
			public static int p;
			public static int q;
			public static boolean flag;
			public static long INF= Long.MAX_VALUE;

			public static long fun(int[] a, int[] b, int m,int n) {
				long result =0;
				for(int i=0; i<m; i++)
					for(int j=0; j<m; j++)
					{
						long[] fib  = new long[Math.max(2, n+2)];
						fib[1] = a[i];
						fib[2] = b[j];
						for(int k=3; k<=n; k++)
							fib[k] = (fib[k-1]%mod + fib[k-2]%mod)%mod;
						result = (result%mod + fib[n]%mod)%mod;
					}

				return result;

			}

			public static double slope(pair p1, pair p2)
			{
				double m = INF;
				if((p1.x - p2.x)!=0)
				m =  (p1.y - p2.y)/(p1.x - p2.x);

				return Math.abs(m);

			}

			public static int count(String[] s, int f)
			{
				int count = 0;
				int n = s[0].length();

				if(f==1)
				{
				for(int i = 0; i<n; i++)
				{
					for(int j=0; j<n; j++)
					{
						if(i%2==0)
						{
							if(j%2==0 && s[i].charAt(j)=='0')
								count++;
							if(j%2==1 && s[i].charAt(j)=='1')
								count++;
						}
						if(i%2==1)
						{
							if(j%2==1 && s[i].charAt(j)=='0')
								count++;
							if(j%2==0 && s[i].charAt(j)=='1')
								count++;
						}

					}
				}
				}
				else
				{

				 count = 0;

				for(int i = 0; i<n; i++)
				{
					for(int j=0; j<n; j++)
					{
						if(i%2==1)
						{
							if(j%2==0 && s[i].charAt(j)=='0')
								count++;
							if(j%2==1 && s[i].charAt(j)=='1')
								count++;
						}
						if(i%2==0)
						{
							if(j%2==1 && s[i].charAt(j)=='0')
								count++;
							if(j%2==0 && s[i].charAt(j)=='1')
								count++;
						}

					}
				}

				}

				return count;

			}

			public static  int gcd(int p2, int p22)
			{
			    if (p2 == 0)
			        return (int) p22;
			    return gcd(p22%p2, p2);
			}

			public static int findGCD(int arr[], int n)
			{
			    int result = arr[0];
			    for (int i=1; i<n; i++)
			        result = gcd(arr[i], result);

			    return result;
			}

			public static void nextGreater(long[] a, int[] ans)
			{

				Stack<Integer> stk = new Stack<>();
				stk.push(0);

				for(int i=1; i<a.length; i++)
				{

					if(!stk.isEmpty())
					{
					int s = stk.pop();
					while(a[s]<a[i])
					{
						ans[s] = i;
						if(!stk.isEmpty())
							s = stk.pop();
						else
							break;
					}
					if(a[s]>=a[i])
						stk.push(s);
					}

					stk.push(i);

				}
				return;

			}

			public static void nextGreaterRev(long[] a, int[] ans)
			{

				int n = a.length;
				int[] pans = new int[n];
				Arrays.fill(pans, -1);
				long[] arev = new long[n];
				for(int i=0; i<n; i++)
					arev[i] = a[n-1-i];

				Stack<Integer> stk = new Stack<>();
				stk.push(0);

				for(int i=1; i<n; i++)
				{

					if(!stk.isEmpty())
					{
					int s = stk.pop();
					while(arev[s]<arev[i])
					{
						pans[s] = n - i-1;
						if(!stk.isEmpty())
							s = stk.pop();
						else
							break;
					}
					if(arev[s]>=arev[i])
						stk.push(s);
					}

					stk.push(i);

				}

				//for(int i=0; i<n; i++)
					//System.out.print(pans[i]+" ");

				for(int i=0; i<n; i++)
					ans[i] = pans[n-i-1];

				return;

			}

			public static void nextSmaller(long[] a, int[] ans)
			{

				Stack<Integer> stk = new Stack<>();
				stk.push(0);

				for(int i=1; i<a.length; i++)
				{

					if(!stk.isEmpty())
					{
					int s = stk.pop();
					while(a[s]>a[i])
					{
						ans[s] = i;
						if(!stk.isEmpty())
							s = stk.pop();
						else
							break;
					}
					if(a[s]<=a[i])
						stk.push(s);
					}

					stk.push(i);

				}
				return;

			}

			public static void print(int[] a)
			{
				PrintWriter pw = new PrintWriter(System.out);
				for(int i=0; i<a.length; i++)
					pw.print(a[i]+" ");

				pw.println();
				pw.flush();
				pw.close();

			}

			public static void print(long[] a)
			{
				PrintWriter pw = new PrintWriter(System.out);
				for(int i=0; i<a.length; i++)
					pw.print(a[i]+" ");

				pw.println();
				pw.flush();
				pw.close();

			}

		    public static long lcm(int[] numbers) {
		        long lcm = 1;
		        int divisor = 2;
		        while (true) {
		            int cnt = 0;
		            boolean divisible = false;
		            for (int i = 0; i < numbers.length; i++) {
		                if (numbers[i] == 0) {
		                    return 0;
		                } else if (numbers[i] < 0) {
		                    numbers[i] = numbers[i] * (-1);
		                }
		                if (numbers[i] == 1) {
		                    cnt++;
		                }
		                if (numbers[i] % divisor == 0) {
		                    divisible = true;
		                    numbers[i] = numbers[i] / divisor;
		                }
		            }
		            if (divisible) {
		                lcm = lcm * divisor;
		            } else {
		                divisor++;
		            }
		            if (cnt == numbers.length) {
		                return lcm;
		            }
		        }
		    }
			public static long fact(long n) {

				long factorial = 1;
				 for(int i = 1; i <= n; i++)
			        {
			            factorial *= i;
			        }
				 return factorial;
			}

	public static void factSieve(int[] a, int n) {

				for(int i=2; i<=n; i+=2)
					a[i] = 2;

				for(int i=3; i<=n; i+=2)
				{
					if(a[i]==0)
					{
						a[i] = i;

						for(int j=i; j*i<=n; j++)
						{
							a[i*j] = i;
						}
					}
				}

				int k = 1000;
				while(k!=1)
				{
					System.out.print(a[k]+" ");
					k /= a[k];

				}
			}

			public static int lowerLimit(int[] a, int n) {
				int ans = 0;

				int ll = 0;
				int rl = a.length-1;
			//	System.out.println(a[rl]+" "+n);
				if(a[0]>n)
					return 0;
				if(a[0]==n)
					return 1;
				else if(a[rl]<=n)
					return rl+1;

				while(ll<=rl)
				{

					int mid = (ll+rl)/2;
					if(a[mid]==n)
					{
						ans = mid + 1;
						break;
					}

					else if(a[mid]>n)
					{
						rl = mid-1;

					}
					else
					{
						ans = mid+1;
						ll = mid+1;
					}
				}

				return ans;
			}

			public static long choose(long total, long choose){
			    if(total < choose)
			        return 0;
			    if(choose == 0 || choose == total)
			        return 1;
			    return (choose(total-1,choose-1)+choose(total-1,choose))%mod;
			}

			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 long[] sort(long[] a)
			{
				Random gen = new Random();
				int n = a.length;
				for(int i=0;i<n;i++)
				{
					int ind = gen.nextInt(n-i)+i;
					long temp = a[ind];
					a[ind] = a[i];
					a[i] = temp;
				}

				Arrays.sort(a);
				return a;
			}

			public static pair[] sort(pair[] a)
			{
				Random gen = new Random();
				int n = a.length;
				for(int i=0;i<n;i++)
				{
					int ind = gen.nextInt(n-i)+i;
					pair temp = a[ind];
					a[ind] = a[i];
					a[i] = temp;
				}

				Arrays.sort(a);
				return a;
			}

			public static int[] sort(int[] a)
			{
				Random gen = new Random();
				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;
				}

				Arrays.sort(a);
				return a;
			}

			public static int floorSearch(int arr[], int low, int high, int x)
			{
			    if (low > high)
			        return -1;

			    if (x > arr[high])
			        return high;
			    int mid = (low+high)/2;

			    if (mid > 0 && arr[mid-1] < x && x < arr[mid])
			        return mid-1;

			    if (x < arr[mid])
			        return floorSearch(arr, low, mid-1, x);

			    return floorSearch(arr, mid+1, high, x);
			}

			public static void swap(int a, int b){
				int temp = a;
				a = b;
				b = temp;
			}
			public static ArrayList<Integer> primeFactorization(int n)
			{
				ArrayList<Integer> a =new ArrayList<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 lowerbound(ArrayList<Long> net, long c2) {
				int i=Collections.binarySearch(net, c2);
				if(i<0)
					i = -(i+2);
				return i;

			}

			public static int lowerboundArray(long[] psum, long c2) {
				int i=Arrays.binarySearch(psum, c2);
				if(i<0)
					i = -(i+2);
				return i;

			}

			public static int lowerboundArray(int[] psum, int c2) {
				int i=Arrays.binarySearch(psum, c2);
				if(i<0)
					i = -(i+2);
				return i;

			}

			public static int uperboundArray(long[] psum, long c2) {
				int i=Arrays.binarySearch(psum, c2);
				if(i<0)
					i = -(i+1);
				return i;

			}

			public static int uperbound(ArrayList<Long> net, long c2) {
				int i=Collections.binarySearch(net, c2);
				if(i<0)
					i = -(i+1);
				return i;

			}

			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 int[] countDer(int n)
		    {
		        int der[] = new int[n + 1];

		        der[0] = 1;
		        der[1] = 0;
		        der[2] = 1;

		        for (int i = 3; i <= n; ++i)
		            der[i] = (i - 1) * (der[i - 1] + der[i - 2]);

		        // Return result for n
		        return der;
		    }

			 static long binomialCoeff(int n, int k)
			    {
			    long C[][] = new long[n+1][k+1];
			    int i, j;

			        // Calculate  value of Binomial Coefficient in bottom up manner
			    for (i = 0; i <= n; i++)
			    {
			        for (j = 0; j <= Math.min(i, k); j++)
			        {
			            // Base Cases
			            if (j == 0 || j == i)
			                C[i][j] = 1;

			            // Calculate value using previosly stored values
			            else
			                C[i][j] = C[i-1][j-1] + C[i-1][j];
			          }
			     }

			    return C[n][k];
			    }

			public static long binaryExponentiation(long x,long n)
			{
			    long result=1;
			    while(n>0)
			    {
			        if(n % 2 ==1)
			            result=result * x;
			        x=(x%mod * x%mod)%mod;
			        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)%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*x)%M;
			        n=n/2;
			    }
			    return result;
			}

			public static int 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 checkYear(int year)
		    {
				if (year % 400 == 0)
		            return true;

		        if (year % 100 == 0)
		            return false;

		        if (year % 4 == 0)
		            return true;
		        return false;
		    }

			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;
			}

			static class pair implements Comparable<pair>

			{
				Long x, y;

				pair(long x, long y) {
					this.x = x;
					this.y = y;
				}

				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;
						if(p.x-x==0 && p.y-y==0)
							return true;
						else
						return false;
					}
					return false;
				}

				public int hashCode() {
					return new Long(x).hashCode() * 31 + new Long(y).hashCode();
				}

			}

			static class triplet implements Comparable<triplet>
			{
				Integer x,y;
				Long z;
				triplet(Integer l,Integer m,long z)
				{
					this.x = l;
					this.y = m;
					this.z = z;
				}

				public  int compareTo(triplet o)
				{
					int result = x.compareTo(o.x);
					if(result==0)
						result =  y.compareTo(o.y);
					if(result==0)
						result = z.compareTo(o.z);

					return result;
				}

				public boolean equlas(Object o)
				{
					if(o instanceof triplet)
					{
						triplet p = (triplet)o;
						return x==p.x && y==p.y && z==p.z;
					}
					return false;
				}

				public String toString()
				{
					return x+" "+y+" "+z;
				}
				public int hashCode()
				{
					return new Long(x).hashCode()*31 + new Long(y).hashCode() + new Long(z).hashCode();
				}
			}

			static class spair implements Comparable<spair>

			{
				String x;
				Integer y;

				spair(String x, int y) {
					this.x = x;
					this.y = y;
				}

				public int compareTo(spair o) {

					String s1 = x + o.x;
					String s2 = o.x + x;
					long p1 = cnt[y][0] + cnt[o.y][0];
					long p2 = p1;

					p1 += cnt[y][1] * cnt[o.y][2];
					p2 += cnt[o.y][1] * cnt[y][2];

					if(p1==p2)
							return 0;
					if(p1>p2)
						return -1;

					return 1;

				}

				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();
				}

			}

			/*static class node implements Comparable<node>

			{
				Integer x, y, z;
				node(int x,int y, int z)
				{
					this.x=x;
					this.y=y;
					this.z=z;
				}

				public int compareTo(pair o) {
					int result = x.compareTo(o.x);
					if(result==0)
						result = y.compareTo(o.y);
					if(result==0)
						result = z.compareTo(z);
					return result;
				}

				@Override
				public int compareTo(node o) {
					// TODO Auto-generated method stub
					return 0;
				}
			}
			*/
		}
		}


import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.Stack;
import java.util.StringTokenizer;
import java.util.TreeMap;
import java.util.TreeSet;
import java.util.Vector;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class C381A {

    static StringTokenizer st;
    static BufferedReader br;
    static PrintWriter pw;

    static class Sort implements Comparable<Sort> {
        int ind, a;

        @Override
        public int compareTo(Sort o) {
            return a - o.a;
        }
        public Sort(int i, int an) {
            ind = i;
            a = an;
        }
    }

    public static void main(String[] args) throws IOException {
        br = new BufferedReader(new InputStreamReader(System.in));
        pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));
        solve();
        pw.close();
    }

    private static void solve() throws IOException {
    	int n = nextInt();
    	int m = nextInt();
    	int minl = n, l = 1, r = n, cr, cl;
    	int[] ans = new int [n + 1];
    	for (int i = 0; i < m; ++i) {
    		cl = nextInt();
    		cr = nextInt();
    		if (cr - cl + 1 < minl) {
    			minl = cr - cl + 1;
    			l = cl;
    			r = cr;
    		}
    	}
    	int cur = 0;
    	for (int i = l; i <= n; ++i) {
    		ans[i] = cur;
    		cur = (cur + 1) % minl;
    	}
    	cur = minl - 1;
    	for (int i = l - 1; i >= 1; --i) {
    		ans[i] = cur;
    		cur = (minl - 1 + cur) % minl;
    	}
    	pw.println(minl);
    	for (int i = 1; i <= n; ++i)
    		pw.print(ans[i]);
    }

    private static int sumf(int[] fen, int id) {
        int summ = 0;
        for (; id >= 0; id = (id & (id + 1)) - 1)
            summ += fen[id];
        return summ;
    }

    private static void addf(int[] fen, int id) {
        for (; id < fen.length; id |= id + 1)
            fen[id]++;
    }

    private static int nextInt() throws IOException {
        return Integer.parseInt(next());
    }
    private static long nextLong() throws IOException {
        return Long.parseLong(next());
    }
    private static double nextDouble() throws IOException {
        return Double.parseDouble(next());
    }
    private static String next() throws IOException {
        while (st==null || !st.hasMoreTokens())
            st = new StringTokenizer(br.readLine());
        return st.nextToken();
    }
}


import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.Stack;
import java.util.StringTokenizer;
import java.util.TreeMap;
import java.util.TreeSet;
import java.util.Vector;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class C381A {

    static StringTokenizer st;
    static BufferedReader br;
    static PrintWriter pw;

    static class Sort implements Comparable<Sort> {
        int ind, a;

        @Override
        public int compareTo(Sort o) {
            return a - o.a;
        }
        public Sort(int i, int an) {
            ind = i;
            a = an;
        }
    }

    public static void main(String[] args) throws IOException {
        br = new BufferedReader(new InputStreamReader(System.in));
        pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));
        solve();
        pw.close();
    }

    private static void solve() throws IOException {
    	int n = nextInt();
    	int m = nextInt();
    	int minl = n, l = 1, r = n, cr, cl;
    	int[] ans = new int [n + 1];
    	for (int i = 0; i < m; ++i) {
    		cl = nextInt();
    		cr = nextInt();
    		if (cr - cl + 1 < minl) {
    			minl = cr - cl + 1;
    			l = cl;
    			r = cr;
    		}
    	}
    	int cur = 0;
    	for (int i = l; i <= n; ++i) {
    		ans[i] = cur;
    		cur = (cur + 1) % minl;
    	}
    	cur = minl - 1;
    	for (int i = l - 1; i >= 1; --i) {
    		ans[i] = cur;
    		cur = (minl - 1 + cur) % minl;
    	}
    	for (int i = 1; i <= n; ++i)
    		pw.print(ans[i]);
    }

    private static int sumf(int[] fen, int id) {
        int summ = 0;
        for (; id >= 0; id = (id & (id + 1)) - 1)
            summ += fen[id];
        return summ;
    }

    private static void addf(int[] fen, int id) {
        for (; id < fen.length; id |= id + 1)
            fen[id]++;
    }

    private static int nextInt() throws IOException {
        return Integer.parseInt(next());
    }
    private static long nextLong() throws IOException {
        return Long.parseLong(next());
    }
    private static double nextDouble() throws IOException {
        return Double.parseDouble(next());
    }
    private static String next() throws IOException {
        while (st==null || !st.hasMoreTokens())
            st = new StringTokenizer(br.readLine());
        return st.nextToken();
    }
}


import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.Stack;
import java.util.StringTokenizer;
import java.util.TreeMap;
import java.util.TreeSet;
import java.util.Vector;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class C381A {

    static StringTokenizer st;
    static BufferedReader br;
    static PrintWriter pw;

    static class Sort implements Comparable<Sort> {
        int ind, a;

        @Override
        public int compareTo(Sort o) {
            return a - o.a;
        }
        public Sort(int i, int an) {
            ind = i;
            a = an;
        }
    }

    public static void main(String[] args) throws IOException {
        br = new BufferedReader(new InputStreamReader(System.in));
        pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));
        solve();
        pw.close();
    }

    private static void solve() throws IOException {
    	int n = nextInt();
    	int m = nextInt();
    	int minl = n, l = 1, r = n, cr, cl;
    	int[] ans = new int [n + 1];
    	for (int i = 0; i < m; ++i) {
    		cl = nextInt();
    		cr = nextInt();
    		if (cr - cl + 1 < minl) {
    			minl = cr - cl + 1;
    			l = cl;
    			r = cr;
    		}
    	}
    	int cur = 0;
    	for (int i = l; i <= n; ++i) {
    		ans[i] = cur;
    		cur = (cur + 1) % minl;
    	}
    	cur = minl - 1;
    	for (int i = l - 1; i >= 1; --i) {
    		ans[i] = cur;
    		cur = (minl - 1 + cur) % minl;
    	}
    	pw.println(minl);
    	for (int i = 1; i <= n; ++i)
    		pw.print(ans[i] + " ");
    }

    private static int sumf(int[] fen, int id) {
        int summ = 0;
        for (; id >= 0; id = (id & (id + 1)) - 1)
            summ += fen[id];
        return summ;
    }

    private static void addf(int[] fen, int id) {
        for (; id < fen.length; id |= id + 1)
            fen[id]++;
    }

    private static int nextInt() throws IOException {
        return Integer.parseInt(next());
    }
    private static long nextLong() throws IOException {
        return Long.parseLong(next());
    }
    private static double nextDouble() throws IOException {
        return Double.parseDouble(next());
    }
    private static String next() throws IOException {
        while (st==null || !st.hasMoreTokens())
            st = new StringTokenizer(br.readLine());
        return st.nextToken();
    }
}


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

public class Main{
  /*
  .
  .
  .
  .
  .
  .
  .
  some constants
  .
  */
  /*
  .
  .
  .
  if any
  .
  .
  */
  public static void main(String[] args) throws IOException{
		/*
		.
		.
		.
		.
		.
		.
    */
    int n=ni();
    int m=ni();
    int l,r;
    int i,j;
    int ans=Integer.MAX_VALUE;
    for(i=0;i<m;i++){
      l=ni();
      r=ni();
      ans=Math.min(ans,(r-l+1));
    }
    sop(ans);
    for(i=0;i<n;i++){
      System.out.print(i%ans+" ");
    }
    /*
		.
		.
		.
		.
		.
		.
		.
		*/
	}
	/*
	temporary functions
	.
	.
	*/
	/*
	fuctions
	.
	.
	.
	.
	.
	.
	.
	.
	.
	.
	.
	.
	.
	.
	.
	.
	.
	abcdefghijklmnopqrstuvwxyz
	.
	.
	.
	.
	.
	.
	*/
	static int modulo(int j,int m){
		if(j<0)
			return m+j;
		  if(j>=m)
			return j-m;

			return j;
	}
	static final int mod=1000000007;
	static final double eps=1e-8;
	static final long inf=100000000000000000L;
	static final boolean debug=true;
	static Reader in=new Reader();
	static StringBuilder ans=new StringBuilder();
	static long powm(long a,long b,long m){
		long an=1;
		long c=a;
		while(b>0){
			if(b%2==1)
				an=(an*c)%m;
			c=(c*c)%m;
			b>>=1;
		}
		return an;
	}
	static Random rn=new Random();
	static void sop(Object a){System.out.println(a);}
	static int ni(){return in.nextInt();}
	static int[] nia(int n){int a[]=new int[n];for(int i=0;i<n;i++)a[i]=ni();return a;}
	static long nl(){return in.nextLong();}
	static long[] nla(int n){long a[]=new long[n];for(int i=0; i<n; i++)a[i]=nl();return a;}
	static String ns(){return in.next();}
	static String[] nsa(int n){String a[]=new String[n];for(int i=0; i<n; i++)a[i]=ns();return a;}
	static double nd(){return in.nextDouble();}
	static double[] nda(int n){double a[]=new double[n];for(int i=0;i<n;i++)a[i]=nd();return a;}
	static class Reader{
		public BufferedReader reader;
		public StringTokenizer tokenizer;
		public Reader(){
			reader=new BufferedReader(new InputStreamReader(System.in),32768);
			tokenizer=null;
		}
		public String next(){
			while(tokenizer==null || !tokenizer.hasMoreTokens()){
				try{
					tokenizer=new StringTokenizer(reader.readLine());
				}
				catch(IOException e){
					throw new RuntimeException(e);
				}
			}
			return tokenizer.nextToken();
		}
		public int nextInt(){
			return Integer.parseInt(next());
		}
		public long nextLong(){
			return Long.parseLong(next());
		}
		public double nextDouble(){
			return Double.parseDouble(next());
		}
	}
}


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

public class Main{
  /*
  .
  .
  .
  .
  .
  .
  .
  some constants
  .
  */
  /*
  .
  .
  .
  if any
  .
  .
  */
  public static void main(String[] args) throws IOException{
		/*
		.
		.
		.
		.
		.
		.
    */
    int n=ni();
    int m=ni();
    int l,r;
    int i,j;
    int ans=Integer.MAX_VALUE;
    for(i=0;i<m;i++){
      l=ni();
      r=ni();
      ans=Math.min(ans,(r-l+1));
    }
    for(i=0;i<n;i++){
      System.out.print(i%ans+" ");
    }
    /*
		.
		.
		.
		.
		.
		.
		.
		*/
	}
	/*
	temporary functions
	.
	.
	*/
	/*
	fuctions
	.
	.
	.
	.
	.
	.
	.
	.
	.
	.
	.
	.
	.
	.
	.
	.
	.
	abcdefghijklmnopqrstuvwxyz
	.
	.
	.
	.
	.
	.
	*/
	static int modulo(int j,int m){
		if(j<0)
			return m+j;
		  if(j>=m)
			return j-m;

			return j;
	}
	static final int mod=1000000007;
	static final double eps=1e-8;
	static final long inf=100000000000000000L;
	static final boolean debug=true;
	static Reader in=new Reader();
	static StringBuilder ans=new StringBuilder();
	static long powm(long a,long b,long m){
		long an=1;
		long c=a;
		while(b>0){
			if(b%2==1)
				an=(an*c)%m;
			c=(c*c)%m;
			b>>=1;
		}
		return an;
	}
	static Random rn=new Random();
	static void sop(Object a){System.out.println(a);}
	static int ni(){return in.nextInt();}
	static int[] nia(int n){int a[]=new int[n];for(int i=0;i<n;i++)a[i]=ni();return a;}
	static long nl(){return in.nextLong();}
	static long[] nla(int n){long a[]=new long[n];for(int i=0; i<n; i++)a[i]=nl();return a;}
	static String ns(){return in.next();}
	static String[] nsa(int n){String a[]=new String[n];for(int i=0; i<n; i++)a[i]=ns();return a;}
	static double nd(){return in.nextDouble();}
	static double[] nda(int n){double a[]=new double[n];for(int i=0;i<n;i++)a[i]=nd();return a;}
	static class Reader{
		public BufferedReader reader;
		public StringTokenizer tokenizer;
		public Reader(){
			reader=new BufferedReader(new InputStreamReader(System.in),32768);
			tokenizer=null;
		}
		public String next(){
			while(tokenizer==null || !tokenizer.hasMoreTokens()){
				try{
					tokenizer=new StringTokenizer(reader.readLine());
				}
				catch(IOException e){
					throw new RuntimeException(e);
				}
			}
			return tokenizer.nextToken();
		}
		public int nextInt(){
			return Integer.parseInt(next());
		}
		public long nextLong(){
			return Long.parseLong(next());
		}
		public double nextDouble(){
			return Double.parseDouble(next());
		}
	}
}


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.StringTokenizer;

public class a {

	public static void main(String[] args) throws IOException {
		FastScanner in = new FastScanner(System.in);
		PrintWriter out = new PrintWriter(System.out);
		int n = in.nextInt();
		int m = in.nextInt();
		int[] ls = new int[m];
		int[] rs = new int[m];
		int ans = n;
		for(int i = 0; i < m; i++) {
			ls[i] = in.nextInt() - 1;
			rs[i] = in.nextInt() - 1;
			int len = rs[i] - ls[i] + 1;
			ans = Math.min(ans, len);
		}
		int[] arr = new int[n];
		for(int i = 0; i < n; i++) {
			arr[i] = i % ans;
		}
		out.println(ans);
		for(int a : arr)
			out.print(a + " ");
		out.println();
		out.close();
	}

	static class FastScanner {
	    BufferedReader br;
	    StringTokenizer st;

	    public FastScanner(InputStream i) {
	        br = new BufferedReader(new InputStreamReader(i));
	        st = new StringTokenizer("");
	    }

	    public String next() throws IOException {
	        if(st.hasMoreTokens())
	            return st.nextToken();
	        else
	            st = new StringTokenizer(br.readLine());
	        return next();
	    }

	    public int nextInt() throws IOException {
	        return Integer.parseInt(next());
	    }
	    public int[] nextIntArray(int n) throws IOException {
	    	int[] arr = new int[n];
	    	for(int i = 0; i < n; i++)
	    		arr[i] = nextInt();
	    	return arr;
	    }
	    public long nextLong() throws IOException {
	        return Long.parseLong(next());
	    }
	    public long[] nextLongArray(int n) throws IOException {
	    	long[] arr = new long[n];
	    	for(int i = 0; i < n; i++)
	    		arr[i] = nextLong();
	    	return arr;
	    }
	    public double nextDouble() throws IOException {
	        return Double.parseDouble(next());
	    }
	    public double[] nextDoubleArray(int n) throws IOException {
	    	double[] arr = new double[n];
	    	for(int i = 0; i < n; i++)
	    		arr[i] = nextDouble();
	    	return arr;
	    }
	    public int[] nextOffsetIntArray(int n) throws IOException {
	    	int[] arr = new int[n];
	    	for(int i = 0; i < n; i++)
	    		arr[i] = nextInt() - 1;
	    	return arr;
	    }
	}
}


import java.util.ArrayList;
import java.util.Collections;
import java.util.Random;
import java.util.Scanner;

/**
 *
 * @author يثمم
 */
public class MinMex {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        Scanner scan =new Scanner(System.in);
        int n =scan.nextInt();
        int m = scan.nextInt();
        int mex=0;
        for(int i=0 ;i<m;i++)
        {
            ArrayList<Long> a = new ArrayList<Long>();
            a.add(scan.nextLong());
            a.add(scan.nextLong());
            Collections.sort(a);
            if(a.get(0)>2||a.get(1)<=2)
            {
                mex=2;
            }
            if(mex!=2&&a.get(i)<=2)
            {
                mex=3;
            }
        }
        System.out.println(mex);
        Random r =new Random();
        for(int i=0;i<n;i++)
        {
            if(mex==2)
            {

                if(i%2==0)
                {
                    System.out.println(0);
                }
                else
                {
                     System.out.println(1);
                }
            }
            else if(mex==3)
            {
                if(i<3)
                {
                    System.out.println(i);
                }
                else
                {
                    System.out.println(r.nextInt()+3);
                }
            }
        }

    }

}


import java.util.ArrayList;
import java.util.Collections;
import java.util.Random;
import java.util.Scanner;

/**
 *
 * @author يثمم
 */
public class MinMex {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        Scanner scan =new Scanner(System.in);
        int n =scan.nextInt();
        int m = scan.nextInt();
        int mex=0;
        for(int i=0 ;i<m;i++)
        {
            ArrayList<Long> a = new ArrayList<Long>();
            a.add(scan.nextLong());
            a.add(scan.nextLong());
            Collections.sort(a);
            if(a.get(0)>2||a.get(1)<=2)
            {
                mex=2;
            }
            if(mex!=2&&a.get(i)<=2)
            {
                mex=3;
            }
        }
        System.out.println(mex);
        Random r =new Random();
        for(int i=0;i<n;i++)
        {
            if(mex==2)
            {

                System.out.println(r.nextInt(2));
            }
            else if(mex==3)
            {
                if(i==0)
                {
                 System.out.println(2);
                }
                else
                {
                    System.out.println(r.nextInt(2));
                }
            }
        }

    }

}


import java.util.ArrayList;
import java.util.Collections;
import java.util.Random;
import java.util.Scanner;

/**
 *
 * @author يثمم
 */
public class MinMex {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        Scanner scan =new Scanner(System.in);
        int n =scan.nextInt();
        int m = scan.nextInt();
        int mex=0;
        for(int i=0 ;i<m;i++)
        {
            ArrayList<Long> a = new ArrayList<Long>();
            a.add(scan.nextLong());
            a.add(scan.nextLong());
            Collections.sort(a);
            if(a.get(1)==1||a.get(0)==0)
            {
                mex=1;
            }
            if((a.get(0)>2||a.get(1)<=2)&&mex!=1)
            {
                mex=2;
            }
            if(mex!=2&&mex!=1&&a.get(i)<=2)
            {
                mex=3;
            }
        }
        System.out.println(mex);
        for(int i=0;i<n;i++)
        {
            if(i<mex)
            {
                System.out.println(i);
            }
            else
            {
            System.out.println(i%mex);
            }
            }

    }

}


import java.util.ArrayList;
import java.util.Collections;
import java.util.Random;
import java.util.Scanner;

/**
 *
 * @author يثمم
 */
public class MinMex {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        Scanner scan =new Scanner(System.in);
        int n =scan.nextInt();
        int m = scan.nextInt();
        int mex=0;
        for(int i=0 ;i<m;i++)
        {
            ArrayList<Long> a = new ArrayList<Long>();
            a.add(scan.nextLong());
            a.add(scan.nextLong());
            Collections.sort(a);
            if(a.get(1)==1||a.get(0)==0)
            {
                mex=1;
            }
            if((a.get(0)>2||a.get(1)<=2)&&mex!=1)
            {
                mex=2;
            }
            if(mex!=2&&mex!=1&&a.get(i)<=2)
            {
                mex=3;
            }
        }
        System.out.println(mex);
        for(int i=0;i<n;i++)
        {
            if(i<=mex)
            {
                System.out.println(i);
            }
            else
            {
            System.out.println(i%mex);
            }
            }

    }

}


import java.util.ArrayList;
import java.util.Collections;
import java.util.Random;
import java.util.Scanner;

/**
 *
 * @author يثمم
 */
public class MinMex {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        Scanner scan =new Scanner(System.in);
        int n =scan.nextInt();
        int m = scan.nextInt();
        int mex=0;
        for(int i=0 ;i<m;i++)
        {
            ArrayList<Long> a = new ArrayList<Long>();
            a.add(scan.nextLong());
            a.add(scan.nextLong());
            Collections.sort(a);
            if(a.get(0)>2||a.get(1)<=2)
            {
                mex=2;
            }
            if(mex!=2&&a.get(i)<=2)
            {
                mex=3;
            }
        }
        System.out.println(mex);
        Random r =new Random();
        for(int i=0;i<n;i++)
        {
            if(mex==2)
            {

                if(i%2==0)
                {
                    System.out.println(0);
                }
                else
                {
                     System.out.println(1);
                }
            }
            else if(mex==3)
            {
                if(i<3)
                {
                    System.out.println(i);
                }
                else
                {
                    System.out.println(0);
                }
            }
        }

    }

}


import java.util.ArrayList;
import java.util.Collections;
import java.util.Random;
import java.util.Scanner;

/**
 *
 * @author يثمم
 */
public class MinMex {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        Scanner scan =new Scanner(System.in);
        int n =scan.nextInt();
        int m = scan.nextInt();
        int mex=0;
        for(int i=0 ;i<m;i++)
        {
            ArrayList<Long> a = new ArrayList<Long>();
            a.add(scan.nextLong());
            a.add(scan.nextLong());
            Collections.sort(a);

            if(a.get(1)==1||a.get(0)==0||a.get(0)==a.get(1))
            {
                mex=1;
            }
           if((a.get(0)>2||a.get(1)<=2)&&mex!=1)
            {
                mex=2;
            }
           if(mex!=2&&mex!=1&&a.get(0)<=2)
            {
                mex=3;
            }
        }
        System.out.println(mex);
        for(int i=0;i<n;i++)
        {
            if(i<mex)
            {
                System.out.println(i);
            }
            else
            {
            System.out.println(i%mex);
            }
            }

    }

}


import java.util.ArrayList;
import java.util.Collections;
import java.util.Random;
import java.util.Scanner;

/**
 *
 * @author يثمم
 */
public class MinMex {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        Scanner scan =new Scanner(System.in);
        int n =scan.nextInt();
        int m = scan.nextInt();
        int mex=0;
        for(int i=0 ;i<m;i++)
        {
            ArrayList<Long> a = new ArrayList<Long>();
            a.add(scan.nextLong());
            a.add(scan.nextLong());
            Collections.sort(a);
            if(a.get(1)==1||a.get(0)==0||a.get(0)==a.get(1))
            {
                mex=1;
            }
            if((a.get(0)>2||a.get(1)<=2)&&mex!=1)
            {
                mex=2;
            }
            if(mex!=2&&mex!=1&&a.get(i)<=2)
            {
                mex=3;
            }
        }
        System.out.println(mex);
        for(int i=0;i<n;i++)
        {
            if(i<mex)
            {
                System.out.println(i);
            }
            else
            {
            System.out.println(i%mex);
            }
            }

    }

}


import java.util.ArrayList;
import java.util.Collections;
import java.util.Random;
import java.util.Scanner;

/**
 *
 * @author يثمم
 */
public class MinMex {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        Scanner scan =new Scanner(System.in);
        int n =scan.nextInt();
        int m = scan.nextInt();
        int mex=0;
        for(int i=0 ;i<m;i++)
        {
            ArrayList<Long> a = new ArrayList<Long>();
            a.add(scan.nextLong());
            a.add(scan.nextLong());
            Collections.sort(a);
            if(a.get(1)-a.get(0)<mex||mex==0)
            {
                mex=(int) (a.get(1)-a.get(0))+1;
            }

        }
        System.out.println(mex);
        for(int i=0;i<n;i++)
        {
            if(i<mex)
            {
                System.out.println(i);
            }
            else
            {
            System.out.println(i%mex);
            }
            }

    }

}


import java.util.ArrayList;
import java.util.Collections;
import java.util.Random;
import java.util.Scanner;

/**
 *
 * @author يثمم
 */
public class MinMex {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        Scanner scan =new Scanner(System.in);
        int n =scan.nextInt();
        int m = scan.nextInt();
        int mex=0;
        for(int i=0 ;i<m;i++)
        {
            ArrayList<Long> a = new ArrayList<Long>();
            a.add(scan.nextLong());
            a.add(scan.nextLong());
            Collections.sort(a);
            if(a.get(0)>2||a.get(1)<=2)
            {
                mex=2;
            }
            if(mex!=2&&a.get(i)<=2)
            {
                mex=3;
            }
        }
        System.out.println(mex);
        Random r =new Random();
        for(int i=0;i<n;i++)
        {
            if(mex==2)
            {

                if(i%2==0)
                {
                    System.out.println(0);
                }
                else
                {
                     System.out.println(1);
                }
            }
            else if(mex==3)
            {
                if(i==0)
                {
                 System.out.println(2);
                }
                else if(i%2==0)
                {
                    System.out.println(0);
                }
                else
                {
                     System.out.println(1);
                }
            }
        }

    }

}


import java.util.ArrayList;
import java.util.Collections;
import java.util.Random;
import java.util.Scanner;

/**
 *
 * @author يثمم
 */
public class MinMex {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        Scanner scan =new Scanner(System.in);
        int n =scan.nextInt();
        int m = scan.nextInt();
        int mex=0;
        for(int i=0 ;i<m;i++)
        {
            ArrayList<Long> a = new ArrayList<Long>();
            a.add(scan.nextLong());
            a.add(scan.nextLong());
            Collections.sort(a);

            if(a.get(1)==1||a.get(0)==0||a.get(0)==a.get(1))
            {
                mex=1;
            }
            else if((a.get(0)>2||a.get(1)<=2)&&mex!=1)
            {
                mex=2;
            }
            else if(mex!=2&&mex!=1&&a.get(1)<=2)
            {
                mex=3;
            }
        }
        System.out.println(mex);
        for(int i=0;i<n;i++)
        {
            if(i<mex)
            {
                System.out.println(i);
            }
            else
            {
            System.out.println(i%mex);
            }
            }

    }

}


import java.util.ArrayList;
import java.util.Collections;
import java.util.Random;
import java.util.Scanner;

/**
 *
 * @author يثمم
 */
public class MinMex {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        Scanner scan =new Scanner(System.in);
        int n =scan.nextInt();
        int m = scan.nextInt();
        int mex=0;
        for(int i=0 ;i<m;i++)
        {
            ArrayList<Long> a = new ArrayList<Long>();
            a.add(scan.nextLong());
            a.add(scan.nextLong());
            Collections.sort(a);
            if(a.get(1)==1||a.get(0)==0)
            {
                mex=1;
            }
            if((a.get(0)>2||a.get(1)<=2)&&mex!=1)
            {
                mex=2;
            }
            if(mex!=2&&mex!=1&&a.get(i)<=2)
            {
                mex=3;
            }
        }
        System.out.println(mex);
        Random r =new Random();
        for(int i=0;i<n;i++)
        {
            if(mex==2)
            {

                if(i%2==0)
                {
                    System.out.println(0);
                }
                else
                {
                     System.out.println(1);
                }
            }
            else if(mex==3||mex==1)
            {
                if(i<3)
                {
                    System.out.println(i);
                }
                else
                {
                    System.out.println(0);
                }
            }
        }

    }

}


package min.mex;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Random;
import java.util.Scanner;

/**
 *
 * @author يثمم
 */
public class MinMex {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        Scanner scan =new Scanner(System.in);
        int n =scan.nextInt();
        int m = scan.nextInt();
        int mex=0;
        for(int i=0 ;i<m;i++)
        {
            ArrayList<Long> a = new ArrayList<Long>();
            a.add(scan.nextLong());
            a.add(scan.nextLong());
            Collections.sort(a);
            if(a.get(0)>2||a.get(1)<=2)
            {
                mex=2;
            }
            if(mex!=2&&a.get(i)<=2)
            {
                mex=3;
            }
        }
        System.out.println(mex);
        Random r =new Random();
        for(int i=0;i<n;i++)
        {
            if(mex==2)
            {

                if(i%2==0)
                {
                    System.out.println(0);
                }
                else
                {
                     System.out.println(1);
                }
            }
            else if(mex==3)
            {
                if(i<3)
                {
                    System.out.println(i);
                }
                else
                {
                    System.out.println(r.nextInt(n)+3);
                }
            }
        }

    }

}


import java.util.ArrayList;
import java.util.Collections;
import java.util.Random;
import java.util.Scanner;

/**
 *
 * @author يثمم
 */
public class MinMex {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        Scanner scan =new Scanner(System.in);
        int n =scan.nextInt();
        int m = scan.nextInt();
        int mex=0;
        for(int i=0 ;i<m;i++)
        {
            ArrayList<Long> a = new ArrayList<Long>();
            a.add(scan.nextLong());
            a.add(scan.nextLong());
            Collections.sort(a);
            if(a.get(0)>2||a.get(1)<=2)
            {
                mex=2;
            }
            if(mex!=2&&a.get(i)<=2)
            {
                mex=3;
            }
        }
        System.out.println(mex);
        Random r =new Random();
        for(int i=0;i<n;i++)
        {
            if(mex==2)
            {

                if(i%2==0)
                {
                    System.out.println(0);
                }
                else
                {
                     System.out.println(1);
                }
            }
            else if(mex==3)
            {
                if(i==0)
                {
                 System.out.println(2);
                }
                else if(i%2==0)
                {
                    System.out.println(0);
                }
                else
                {
                     System.out.println(1);
                }
            }
        }

    }


package min.mex;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Random;
import java.util.Scanner;

/**
 *
 * @author يثمم
 */
public class MinMex {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        Scanner scan =new Scanner(System.in);
        int n =scan.nextInt();
        int m = scan.nextInt();
        int mex=0;
        for(int i=0 ;i<m;i++)
        {
            ArrayList<Long> a = new ArrayList<Long>();
            a.add(scan.nextLong());
            a.add(scan.nextLong());
            Collections.sort(a);
            if(a.get(0)>2||a.get(1)<=2)
            {
                mex=2;
            }
            if(mex!=2&&a.get(i)<=2)
            {
                mex=3;
            }
        }
        System.out.println(mex);
        for(int i=0;i<n;i++)
        {
            if(mex==2)
            {
                Random r =new Random();
                System.out.println(r.nextInt(2)+1);
            }
            else if(mex==3)
            {
               System.out.println(i);
            }
        }

    }

}


import java.util.ArrayList;
import java.util.Collections;
import java.util.Random;
import java.util.Scanner;

/**
 *
 * @author يثمم
 */
public class MinMex {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        Scanner scan =new Scanner(System.in);
        int n =scan.nextInt();
        int m = scan.nextInt();
        int mex=0;
        for(int i=0 ;i<m;i++)
        {
            ArrayList<Long> a = new ArrayList<Long>();
            a.add(scan.nextLong());
            a.add(scan.nextLong());
            Collections.sort(a);
            if(a.get(1)==1||a.get(0)==0)
            {
                mex=1;
            }
            if((a.get(0)>2||a.get(1)<=2)&&mex!=1)
            {
                mex=2;
            }
            if(mex!=2&&mex!=1&&a.get(i)<=2)
            {
                mex=3;
            }
        }
        System.out.println(mex);
        Random r =new Random();
        for(int i=0;i<n;i++)
        {
            System.out.println(r.nextInt(m));
        }

    }


import java.util.ArrayList;
import java.util.Collections;
import java.util.Random;
import java.util.Scanner;

/**
 *
 * @author يثمم
 */
public class MinMex {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        Scanner scan =new Scanner(System.in);
        int n =scan.nextInt();
        int m = scan.nextInt();
        int mex=0;
        for(int i=0 ;i<m;i++)
        {
            ArrayList<Long> a = new ArrayList<Long>();
            a.add(scan.nextLong());
            a.add(scan.nextLong());
            Collections.sort(a);
            if(a.get(0)>2||a.get(1)<=2)
            {
                mex=2;
            }
            if(mex!=2&&a.get(i)<=2)
            {
                mex=3;
            }
        }
        System.out.println(mex);
        for(int i=0;i<n;i++)
        {
            if(mex==2)
            {
                Random r =new Random();
                System.out.println(r.nextInt(2)+1);
            }
            else if(mex==3)
            {
               System.out.println(i);
            }
        }

    }

}


import java.util.ArrayList;
import java.util.Collections;
import java.util.Random;
import java.util.Scanner;

/**
 *
 * @author يثمم
 */
public class MinMex {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        Scanner scan =new Scanner(System.in);
        int n =scan.nextInt();
        int m = scan.nextInt();
        int mex=0;
        for(int i=0 ;i<m;i++)
        {
            ArrayList<Long> a = new ArrayList<Long>();
            a.add(scan.nextLong());
            a.add(scan.nextLong());
            Collections.sort(a);
            if(a.get(0)>2||a.get(1)<=2)
            {
                mex=2;
            }
            if(mex!=2&&a.get(i)<=2)
            {
                mex=3;
            }
        }
        System.out.println(mex);
        Random r =new Random();
        for(int i=0;i<n;i++)
        {
            if(mex==2)
            {

                if(i%2==0)
                {
                    System.out.println(0);
                }
                else
                {
                     System.out.println(1);
                }
            }
            else if(mex==3)
            {
                if(i<3)
                {
                    System.out.println(i);
                }
                else
                {
                    System.out.println(r.nextInt(n)+3);
                }
            }
        }

    }

}