using System;
using System.IO;
using System.Text;
using System.Collections.Generic;
using System.Linq;

namespace aaaa
{
	class MainClass
	{
		public static void Main(string[] args)
		{
			var numLs = AskIntList("");

			var ls = new List<String>();

			for (int i = 0; i < numLs[0];i++)
				ls.Add(AskString(""));

			for (int i = 0; i < numLs[1] + 2; i++)
			{
				Console.Write("#");
			}


				Console.Write("\n");


			foreach (var obj in ls)
			{
				Console.Write("#");
				Console.Write(obj);
				Console.WriteLine("#");
			}


			for (int i = 0; i<numLs[1] + 2; i++)
			{
				Console.Write("#");
			}

				Console.Write("\n");


		}

/*----------------以下汎用的に使う関数------------------------------*/

		private static List<char> ConvertIntToCharList(int num)
		{
		List<char> answer = new List<char>();
		for (int i = 1; Math.Abs(num) >= Math.Pow(10, i - 1); i++)
		{
		//下から数えてi桁目の数字を抽出
		int curKetaNumber = (num % (int)Math.Pow(10, i) - num % (int)Math.Pow(10, i - 1));
		//123なら100,20,3が抽出できたので、1,2,3にする。
		curKetaNumber /= (int)Math.Pow(10, i - 1);

		answer.Add((char)(curKetaNumber + '0'));
		}

		return answer;
		}

		/*public static void SaveTextData(List<string> stringLs,string fileName)
		{
			StreamWriter cWriter = (
				new StreamWriter(fileName,Encoding.Default)
			);

			foreach (var str in stringLs)
			{
				cWriter.WriteLine(str);
			}

			cWriter.Close();
		}*/

		public static List<List<char>> GetTextDataAsCharLists(string fileName)
		{
		List<List<char>> ans = new List<List<char>>();


		// StreamReader の新しいインスタンスを生成する
		StreamReader cReader = (
			new StreamReader(fileName, Encoding.Default)
		);

		// 読み込みできる文字がなくなるまで繰り返す
		while (cReader.Peek() >= 0)
		{
		// ファイルを 1 行ずつ読み込む
		string stBuffer = cReader.ReadLine();

		ans.Add(stBuffer.ToCharArray().ToList());
		}
		// cReader を閉じる (正しくは オブジェクトの破棄を保証する を参照)
		cReader.Close();

		return ans;
		}

		public static List<string> GetTextDataAsStrings(string fileName)
		{
		List<string> ans = new List<string>();

		// StreamReader の新しいインスタンスを生成する
		StreamReader cReader = (
			new StreamReader(fileName, Encoding.Default)
		);

		// 読み込みできる文字がなくなるまで繰り返す
		while (cReader.Peek() >= 0)
		{
		// ファイルを 1 行ずつ読み込む
		string stBuffer = cReader.ReadLine();

		ans.Add(stBuffer);
		}
		// cReader を閉じる (正しくは オブジェクトの破棄を保証する を参照)
		cReader.Close();

		return ans;
		}

		public static List<List<char>> ChangeXYTextData(List<List<char>> ls)
		{
		var ans = new List<List<char>>();
		for (int i = 0; i < ls.OrderByDescending(obj => obj.Count).ToList()[0].Count; i++)
		{
		var charList = new List<char>();
		for (int j = 0; j < ls.Count; j++)
		{
		charList.Add(ls[j][i]);
		}
		ans.Add(charList);
		}
		return ans;
		}

		private static List<int> ConvertStringToListInt(string rawData)
		{
		List<string> strList = rawData.Split(',').ToList();
		List<int> intList = strList.Select(int.Parse).ToList();

		return intList;
		}

		private static bool TryConvertStringToListInt(string rawData, out List<int> ans)
		{
		bool flag = true;

		//stringをカンマ区切りで分解(例外処理有り)
		List<string> strList = rawData.Split(' ').ToList();
		try
		{

		}
		catch
		{
		flag = false;
		}

		//区切った文字を数値にParseする(例外処理有り)
		List<int> intList = new List<int>();

		foreach (var obj in strList)
		{
		int num = new int();
		if (!int.TryParse(obj, out num))
		flag = false;
		else
		intList.Add(num);
		}

		ans = intList;

		return flag;
		}

		private static bool TryConvertStringToListString(string rawData, out List<string> ans)
		{
		bool flag = true;

		//stringをカンマ区切りで分解(例外処理有り)
		List<string> strList = rawData.Split(' ').ToList();
		try
		{

		}
		catch
		{
		flag = false;
		}

		ans = strList;

		return flag;
		}

		private static List<char> ConvertStringToListChar(string rawData)
		{
		return rawData.ToList();
		}

		public static void GetInput(List<List<char>> dataList)
		{
		foreach (var obj in dataList)
		{
		foreach (var mozi in obj)
		{
		Console.Write(mozi);
		}
		Console.Write("\n");
		}
		}

		public static List<int> AskIntList(string message, int num)
		{

		var ls = new List<int>();
		while (true)
		{
		ls = AskIntList(message);
		if (ls.Count != num)
		Console.WriteLine("個数が違います");
		else
		break;
		}

		return ls;
		}

		public static List<int> AskIntList(string message)
		{
		Console.WriteLine(message);

		var ans = new List<int>();
		while (true)
		{
		if (!TryConvertStringToListInt(Console.ReadLine(), out ans))
		Console.WriteLine("正しく入力してください");
		else
		break;
		}
		return ans;
		}

		public static List<string> AskStringList(string message, int num)
		{

		var ls = new List<string>();
		while (true)
		{
		ls = AskStringList(message);
		if (ls.Count != num)
		Console.WriteLine("個数が違います");
		else
		break;
		}

		return ls;
		}

		public static List<string> AskStringList(string message)
		{
		Console.WriteLine(message);

		var ans = new List<string>();
		while (true)
		{
		if (!TryConvertStringToListString(Console.ReadLine(), out ans))
		Console.WriteLine("正しく入力してください");
		else
		break;
		}
		return ans;
		}

		public static List<char> AskCharList(string message, int num)
		{
		var ls = new List<char>();
		while (true)
		{
		ls = AskCharList(message);
		try
		{
		if (ls.Count != num)
		Console.WriteLine("個数が違います");
		else
		break;
		}
		catch
		{
		Console.WriteLine("正しく入力してください");
		}

		}
		return ls;
		}

		public static List<char> AskCharList(string message)
		{
		Console.WriteLine(message);
		return ConvertStringToListChar(Console.ReadLine());
		}

		public static string AskString(string message)
		{
		Console.WriteLine(message);
		return Console.ReadLine();
		}

		public static int AskInt(string message)
		{
		Console.WriteLine(message);

		int ans;

		while (!int.TryParse(Console.ReadLine(), out ans))
		{
		//ansに値が入るまでTryParseを繰り返す
		Console.WriteLine("入力しなおしてください");
		}

		return (int)ans;

		}

		public static string ConvertCharListToString(List<char> ls)
		{
		return new String(ls.ToArray());
		}

		private static List<int> SplitData(string rawData)
		{
			List<string> strList = rawData.Split(' ').ToList();

			List<int> intList = strList.Select(int.Parse).ToList();
			//どうやたらint.Parse(要素)をセレクトしちゃってるらしい。見じけぇやべぇはぇえ

			return intList;
				}

	}
}


Measured memory_bytes: 13268