302 4
abdcbdcbdcbdcbdcbdcbdcbdcbdcbdcbdcbdcbdcbdcbdcbdcbdcbdcbdcbdcbdcbdcbdcbdcbdcbdcbdcbdcbdcbdcbdcbdcbdcbdcbdcbdcbdcbdcbdcbdcbdcbdcbdcbdcbdcbdcbdcbdcbdcbdcbdcbdcbdcbdcbdcbdcbdcbdcbdcbdcbdcbdcbdcbdcbdcbdcbdcbdcbdcbdcbdcbdcbdcbdcbdcbdcbdcbdcbdcbdcbdcbdcbdcbdcbdcbdcbdcbdcbdcbdcbdcbdcbdcbdcbdcbdcbdcbdcbdcbdcb
 300 3
abcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabc
 10 10
fajegfaicb
 70 4
dcbdcbdcbdcbdcbdcbdcbdcbdcbdcbdcbdcbdcbdcbdcbdcbdcbdcbdcbdcbdcbdcbdcbd
 100 4
abcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabca
 5 5
aceba
 3 4
cdb
 2 2
ab
 11 3
abcabcabcab
 3 26
yzx
 2 4
cd
 7 26
zyxzyxz
 3 3
acb
 1 2
a
 77 7
cadgbagbcaecgfaegcdbeafbacbdfgaedgcdeabgebaecbeacgfebagedcegdafdgeacegfegfegf
 1 26
o
 10 3
cbacbacbac
 10 5
abcabcabca
 26 26
ahnxdnbfcriersyzdihuecojdi
 1 2
b
 13 7
gfegfegfegfeg
 1 1
a
 6 3
acbacb
 17 26
bazyxzyxzyxzyxzyx
 12 10
abcabcabcabc
 333 5
edcedcedcedcedcedcedcedcedcedcedcedcedcedcedcedcedcedcedcedcedcedcedcedcedcedcedcedcedcedcedcedcedcedcedcedcedcedcedcedcedcedcedcedcedcedcedcedcedcedcedcedcedcedcedcedcedcedcedcedcedcedcedcedcedcedcedcedcedcedcedcedcedcedcedcedcedcedcedcedcedcedcedcedcedcedcedcedcedcedcedcedcedcedcedcedcedcedcedcedcedcedcedcedcedcedcedcedcedcedcedc
 1 26
z
 3 3
cab
 15 11
cgjkbadjfbdaikj
 6 3
abcabc
 17 4
dabcadcbdcadbcdbc
 30 7
cedcfedcfgcfgcbadcadgfaegfacgf
 30 26
abcabcabczyxzyxzyxzyxzyxzyxzyx
 2 2
ba

acbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbac
 acbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacbacb
 fajegfaicd
 NO
 abcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcd
 acebc
 dab
 ba
 acbacbacbac
 zab
 da
 NO
 bac
 b
 cadgbagbcaecgfaegcdbeafbacbdfgaedgcdeabgebaecbeacgfebagedcegdafdgeacfabcabcab
 p
 NO
 abcabcabcd
 ahnxdnbfcriersyzdihuecojdk
 NO
 NO
 NO
 bacbac
 bcabcabcabcabcabc
 abcabcabcabd
 NO
 NO
 cba
 cgjkbadjfbdajba
 acbacb
 dabcadcbdcadcabca
 cedcfedcfgcfgcbadcadgfaegfadba
 abcabcabdabcabcabcabcabcabcabc
 NO

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.io.Reader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.StringTokenizer;

import javax.swing.Timer;

public class C1 {

	public C1() 
	{
		long millis = System.currentTimeMillis();
		//try{
//		int delay = 750; //milliseconds
//		  ActionListener taskPerformer = new ActionListener() {
//		      public void actionPerformed(ActionEvent evt) {
//		          System.out.println("NO");
//		          System.exit(0);
//		      }
//		  };
//		  new Timer(delay, taskPerformer).start();
		  
		
		Scanner s = new Scanner();
		PrintStream p = System.out;
		
		int n = s.nextInt();
		int p1 = s.nextInt();
		
		String str = s.next();
		
//		int n = 13 ; int p1 = 7;
//
//		String str = "gfegfegfegfeg";

		
		char[] chars = new char[str.length()];
		for (int i = 0; i < str.length(); i++)
		{
			chars[i] = str.charAt(i);
		}
	
		//char[] ch = {'c', 'b', 'b'};
		//System.out.println(isPalindrome(chars, 1, 3));
		//System.out.println("jklsdaf");
		
		int limit = p1 + 97;
		
		//accommdate test for just 'a'. 
		if (str.equals("a") && p1 > 1)
		{
			System.out.println("b");
			System.exit(0);
		}
		
		boolean done = false;
		while (System.currentTimeMillis() - millis < 900)
		{
			boolean allz = true;
			for (int i = 0; i < n; i++)
			{
				if (chars[i] != (char)(p1 + 96))
					allz = false;
			}
			if (allz)
			{
				
				done = true;
				break;
			}
		
//			for (int j = 0; j < chars.length; j++)
//			{
//				System.out.print(chars[j]);
//			}
//			System.out.println("");
			
			for (int i = chars.length - 1; i >= 0; i--)
			{
				
				chars[i]++;
				if (chars[i] == (char)limit)
					chars[i] = 'a';
				else
					break;
				
				
			}
			if (!containsPalindrome(chars))
				break;
		}
		
		if (done || System.currentTimeMillis() - millis >= 900)
		{
			System.out.println("NO");
			System.exit(0);
		}
		for (int i = 0; i < chars.length; i++)
		{
			System.out.print(chars[i]);
		}
		System.out.println();
		System.exit(0);
		
		
//		}
//		catch(Throwable e)
//		{
//			System.out.println("NO");
//			System.exit(0);
//		}
	}
	
	public boolean containsPalindrome(char[] chars)
	{
		boolean yes = false;
		for (int i = 0; i < chars.length; i++)
		{
			for (int j = i + 2; j < chars.length + 1; j++)
			{
				if (isPalindrome(chars, i, j))
				{
					return true;
				}
			}
		}
		return false;
	}
	
	//check
	public boolean isPalindrome(char[] chars, int one, int two)
	{
		//System.out.println(one + " , " + two);
		
		boolean yes = true;
		
		for (int i = one; i < (one + two) / 2; i++)
		{
			if (chars[i] != chars[two - 1 - (i - one)])
				return false;
		}
			return true;
		
	}
	
	
	
	public static void main(String[] args) {
		new C1();
	}

	public static class Scanner {
		BufferedReader br;
		StringTokenizer st;

		public Scanner(Reader in) {
			br = new BufferedReader(in);
		}

		public Scanner() {
			this(new InputStreamReader(System.in));
		}

		String next() {
			while (st == null || !st.hasMoreElements()) {
				try {
					st = new StringTokenizer(br.readLine());
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			return st.nextToken();
		}

		int nextInt() {
			return Integer.parseInt(next());
		}

		long nextLong() {
			return Long.parseLong(next());
		}

		double nextDouble() {
			return Double.parseDouble(next());
		}

		// Slightly different from java.util.Scanner.nextLine(),
		// which returns any remaining characters in current line,
		// if any.
		String readNextLine() {
			String str = "";
			try {
				str = br.readLine();
			} catch (IOException e) {
				e.printStackTrace();
			}
			return str;
		}

		public int[] readNextLineInts(int numberOfInts) {
			int[] ints = new int[numberOfInts];
			for (int i = 0; i < numberOfInts; i++)
				ints[i] = nextInt();
			return ints;
		}
		
		public double[] readNextLineDoubles(int numberOfDoubles) {
			double[] doubles = new double[numberOfDoubles];
			for (int i = 0; i < numberOfDoubles; i++)
				doubles[i] = nextDouble();
			return doubles;
		}
		// --------------------------------------------------------
	}
}