#![allow(unused_imports)]
#![allow(unused_macros)]
// use proconio::input;
use std::cmp::Ordering::*;
use std::collections::{BTreeMap, BTreeSet};
use std::io::{self, BufWriter, Write};
use std::str::{self, SplitAsciiWhitespace};

// I have no idea what I'm doing

macro_rules! answer {
    ($out:ident, $ans:expr) => {
        writeln!($out, "{}", $ans)
    };
}

const M: i64 = 1_000_000_007;

fn exp(mut x: i64, mut e: i64) -> i64 {
    let mut ans = 1;
    while e > 0 {
        if e & 1 == 1 {
            ans = ans * x % M;
        }
        x = x * x % M;
        e >>= 1;
    }
    ans
}

// Gimmicky return type, I know
// But I wanted to try it
// I don't use (fac, inv) for anything else, really
fn build_ncr() -> impl Fn(usize, usize) -> i64 {
    const N: usize = 2_000_001;
    let mut f = vec![0; N];
    let mut inv = vec![0; N];
    f[0] = 1;
    for i in 1..N {
        f[i] = f[i-1] * i as i64 % M;
    }
    inv[N-1] = exp(f[N-1], M - 2);
    for i in (0..N-1).rev() {
        inv[i] = inv[i+1] * (i + 1) as i64 % M;
    }

    move |n, k| f[n] * inv[k] % M * inv[n - k] % M
}

fn main() -> Result<(), io::Error> {
    let (stdin, stdout) = (io::stdin(), io::stdout());
    let mut scan = UnsafeScanner::new(stdin.lock());
    let mut out = BufWriter::new(stdout.lock());

    let ncr = build_ncr();

    let k: usize = scan.token();
    let n = scan.token::<String>().len();

    let mut ans = 0;
    for i in n..=n+k {
        let x = exp(25, (i - n) as i64);
        let y = exp(26, (n + k - i) as i64);
        let z = ncr(i - 1, n - 1);
        ans += x * y % M * z % M;
        if ans >= M { ans -= M; }
    }

    answer!(out, ans)
}

///////////////////////////////////////////////////////////////////////////////////////////////////

/// Mostly copied from https://github.com/EbTech/rust-algorithms/blob/master/src/scanner.rs
/// Same API as Scanner but nearly twice as fast, using horribly unsafe dark arts
/// **REQUIRES** Rust 1.34 or higher
pub struct UnsafeScanner<R> {
    reader: R,
    buf_str: Vec<u8>,
    buf_iter: SplitAsciiWhitespace<'static>,
}

impl<R: io::BufRead> UnsafeScanner<R> {
    pub fn new(reader: R) -> Self {
        Self {
            reader,
            buf_str: vec![],
            buf_iter: "".split_ascii_whitespace(),
        }
    }

    /// This function should be marked unsafe, but noone has time for that in a
    /// programming contest. Use at your own risk!
    pub fn token<T: str::FromStr>(&mut self) -> T {
        loop {
            if let Some(token) = self.buf_iter.next() {
                return token.parse().ok().expect("Failed parse [Scanner]");
            }
            self.buf_str.clear();
            self.reader
                .read_until(b'\n', &mut self.buf_str)
                .expect("Failed read");
            self.buf_iter = unsafe {
                let slice = str::from_utf8_unchecked(&self.buf_str);
                std::mem::transmute(slice.split_ascii_whitespace())
            }
        }
    }

    pub fn pair<T: str::FromStr>(&mut self) -> (T, T) {
        (self.token(), self.token())
    }
}

// aka #![feature(bool_to_option)]
trait BoolThen {
    fn then_<T>(self, f: impl FnOnce() -> T) -> Option<T>;
}

impl BoolThen for bool {
    fn then_<T>(self, f: impl FnOnce() -> T) -> Option<T> {
        if self {
            Some(f())
        } else {
            None
        }
    }
}

trait BoolToYes {
    fn yes(self) -> &'static str;
}

impl BoolToYes for bool {
    fn yes(self) -> &'static str {
        match self {
            true => "YES",
            false => "NO",
        }
    }
}


Measured memory_bytes: 35268