description: Polycarp has come up with a new game to play with you. He calls it "A missing bigram".
  
  A bigram of a word is a sequence of two adjacent letters in it.
  
  For example, word "abbaaba" contains bigrams "ab", "bb", "ba", "aa", "ab" and "ba".
  
  The game goes as follows. First, Polycarp comes up with a word, consisting only of lowercase letters 'a' and 'b'. Then, he writes down all its bigrams on a whiteboard in the same order as they appear in the word. After that, he wipes one of them off the whiteboard.
  
  Finally, Polycarp invites you to guess what the word that he has come up with was.
  
  Your goal is to find any word such that it's possible to write down all its bigrams and remove one of them, so that the resulting sequence of bigrams is the same as the one Polycarp ended up with.
  
  The tests are generated in such a way that the answer exists. If there are multiple answers, you can print any of them.
  
  Input
  
  The first line contains a single integer t (1 ≤ t ≤ 2000) — the number of testcases.
  
  The first line of each testcase contains a single integer n (3 ≤ n ≤ 100) — the length of the word Polycarp has come up with.
  
  The second line of each testcase contains n-2 bigrams of that word, separated by a single space. Each bigram consists of two letters, each of them is either 'a' or 'b'.
  
  Additional constraint on the input: there exists at least one string such that it is possible to write down all its bigrams, except one, so that the resulting sequence is the same as the sequence in the input. In other words, the answer exists.
  
  Output
  
  For each testcase print a word, consisting of n letters, each of them should be either 'a' or 'b'. It should be possible to write down all its bigrams and remove one of them, so that the resulting sequence of bigrams is the same as the one Polycarp ended up with.
  
  The tests are generated in such a way that the answer exists. If there are multiple answers, you can print any of them. 
  
  Example
  
  Input
  
  
  4
  7
  ab bb ba aa ba
  7
  ab ba aa ab ba
  3
  aa
  5
  bb ab bb
  
  
  Output
  
  
  abbaaba
  abaabaa
  baa
  bbabb
  
  Note
  
  The first two testcases from the example are produced from the word "abbaaba". As listed in the statement, it contains bigrams "ab", "bb", "ba", "aa", "ab" and "ba".
  
  In the first testcase, the 5-th bigram is removed. 
  
  In the second testcase, the 2-nd bigram is removed. However, that sequence could also have been produced from the word "abaabaa". It contains bigrams "ab", "ba", "aa", "ab", "ba" and "aa". The missing bigram is the 6-th one.
  
  In the third testcase, all of "baa", "aab" and "aaa" are valid answers.
solution: //Utilities
  import java.io.*;
  import java.util.*;
  
  public class A {
  	static int t;
  	static int n;
  	static char[] res;
  	static char p1, p2, c1, c2;
  	
  	public static void main(String[] args) throws IOException {
  		t = in.iscan();
  		while (t-- > 0) {
  			run();
  		}
  		out.close();
  	} 
  	
  	static void run() throws IOException {
  		n = in.iscan(); res = new char[n]; Arrays.fill(res, 'z');
  		p1 = (char)(-1); p2 = (char)(-1);
  		int idx = 0;
  		for (int i = 0; i < n-2; i++) {
  			String str = in.sscan();
  			c1 = str.charAt(0); c2 = str.charAt(1);
  			if (c1 == p2) {
  				res[idx++] = c2;
  			}
  			else {
  				res[idx++] = c1; res[idx++] = c2;
  			}
  			p1 = c1; p2 = c2;
  		}
  		if (res[n-1] == 'z') {
  			res[n-1] = 'a';
  		}
  		out.println(res);
  	}
  	
  	static INPUT in = new INPUT(System.in);
  	static PrintWriter out = new PrintWriter(System.out);
  	private static class INPUT {
  
  		private InputStream stream;
  		private byte[] buf = new byte[1024];
  		private int curChar, numChars;
  
  		public INPUT (InputStream stream) {
  			this.stream = stream;
  		}
  
  		public INPUT (String file) throws IOException {
  			this.stream = new FileInputStream (file);
  		}
  
  		public int cscan () throws IOException {
  			if (curChar >= numChars) {
  				curChar = 0;
  				numChars = stream.read (buf);
  			}
  			
  			if (numChars == -1)
  				return numChars;
  
  			return buf[curChar++];
  		}
  
  		public int iscan () throws IOException {
  			int c = cscan (), sgn = 1;
  			
  			while (space (c))
  				c = cscan ();
  
  			if (c == '-') {
  				sgn = -1;
  				c = cscan ();
  			}
  
  			int res = 0;
  
  			do {
  				res = (res << 1) + (res << 3);
  				res += c - '0';
  				c = cscan ();
  			}
  			while (!space (c));
  
  			return res * sgn;
  		}
  
  		public String sscan () throws IOException {
  			int c = cscan ();
  			
  			while (space (c))
  				c = cscan ();
  
  			StringBuilder res = new StringBuilder ();
  
  			do {
  				res.appendCodePoint (c);
  				c = cscan ();
  			}
  			while (!space (c));
  
  			return res.toString ();
  		}
  
  		public double dscan () throws IOException {
  			int c = cscan (), sgn = 1;
  			
  			while (space (c))
  				c = cscan ();
  
  			if (c == '-') {
  				sgn = -1;
  				c = cscan ();
  			}
  
  			double res = 0;
  
  			while (!space (c) && c != '.') {
  				if (c == 'e' || c == 'E')
  					return res * UTILITIES.fast_pow (10, iscan ());
  				
  				res *= 10;
  				res += c - '0';
  				c = cscan ();
  			}
  
  			if (c == '.') {
  				c = cscan ();
  				double m = 1;
  
  				while (!space (c)) {
  					if (c == 'e' || c == 'E')
  						return res * UTILITIES.fast_pow (10, iscan ());
  
  					m /= 10;
  					res += (c - '0') * m;
  					c = cscan ();
  				}
  			}
  
  			return res * sgn;
  		}
  
  		public long lscan () throws IOException {
  			int c = cscan (), sgn = 1;
  			
  			while (space (c))
  				c = cscan ();
  
  			if (c == '-') {
  				sgn = -1;
  				c = cscan ();
  			}
  
  			long res = 0;
  
  			do {
  				res = (res << 1) + (res << 3);
  				res += c - '0';
  				c = cscan ();
  			}
  			while (!space (c));
  
  			return res * sgn;
  		}
  
  		public boolean space (int c) {
  			return c == ' ' || c == '\n' || c == '\r' || c == '\t' || c == -1;
  		}
  	}
  
  	public static class UTILITIES {
  
  		static final double EPS = 10e-6;
  		
  		public static void sort(int[] a, boolean increasing) {
  			ArrayList<Integer> arr = new ArrayList<Integer>();
  			int n = a.length;
  			for (int i = 0; i < n; i++) {
  				arr.add(a[i]);
  			}
  			Collections.sort(arr);
  			for (int i = 0; i < n; i++) {
  				if (increasing) {
  					a[i] = arr.get(i);
  				}
  				else {
  					a[i] = arr.get(n-1-i);
  				}
  			}
  		}
  		
  		public static void sort(long[] a, boolean increasing) {
  			ArrayList<Long> arr = new ArrayList<Long>();
  			int n = a.length;
  			for (int i = 0; i < n; i++) {
  				arr.add(a[i]);
  			}
  			Collections.sort(arr);
  			for (int i = 0; i < n; i++) {
  				if (increasing) {
  					a[i] = arr.get(i);
  				}
  				else {
  					a[i] = arr.get(n-1-i);
  				}
  			}
  		}
  		
  		public static void sort(double[] a, boolean increasing) {
  			ArrayList<Double> arr = new ArrayList<Double>();
  			int n = a.length;
  			for (int i = 0; i < n; i++) {
  				arr.add(a[i]);
  			}
  			Collections.sort(arr);
  			for (int i = 0; i < n; i++) {
  				if (increasing) {
  					a[i] = arr.get(i);
  				}
  				else {
  					a[i] = arr.get(n-1-i);
  				}
  			}
  		}
  
  		public static int lower_bound (int[] arr, int x) {
  			int low = 0, high = arr.length, mid = -1;
  
  			while (low < high) {
  				mid = (low + high) / 2;
  
  				if (arr[mid] >= x)
  					high = mid;
  				else
  					low = mid + 1;
  			}
  
  			return low;
  		}
  
  		public static int upper_bound (int[] arr, int x) {
  			int low = 0, high = arr.length, mid = -1;
  
  			while (low < high) {
  				mid = (low + high) / 2;
  
  				if (arr[mid] > x)
  					high = mid;
  				else
  					low = mid + 1;
  			}
  
  			return low;
  		}
  		
  		public static void updateMap(HashMap<Integer, Integer> map, int key, int v) {
  			if (!map.containsKey(key)) {
  				map.put(key, v);
  			}
  			else {
  				map.put(key, map.get(key) + v);
  			}
  			if (map.get(key) == 0) {
  				map.remove(key);
  			}
  		}
  
  		public static long gcd (long a, long b) {
  			return b == 0 ? a : gcd (b, a % b);
  		}
  
  		public static long lcm (long a, long b) {
  			return a * b / gcd (a, b);
  		}
  
  		public static long fast_pow_mod (long b, long x, int mod) {
  			if (x == 0) return 1;
  			if (x == 1) return b;
  			if (x % 2 == 0) return fast_pow_mod (b * b % mod, x / 2, mod) % mod;
  
  			return b * fast_pow_mod (b * b % mod, x / 2, mod) % mod;
  		}
  
  		public static int fast_pow (int b, int x) {
  			if (x == 0) return 1;
  			if (x == 1) return b;
  			if (x % 2 == 0) return fast_pow (b * b, x / 2);
  
  			return b * fast_pow (b * b, x / 2);
  		}
  
  		public static long choose (long n, long k) {
  			k = Math.min (k, n - k);
  			long val = 1;
  
  			for (int i = 0; i < k; ++i)
  				val = val * (n - i) / (i + 1);
  
  			return val;
  		}
  
  		public static long permute (int n, int k) {
  			if (n < k) return 0;
  			long val = 1;
  
  			for (int i = 0; i < k; ++i)
  				val = (val * (n - i));
  
  			return val;
  		}
  		
  		// start of permutation and lower/upper bound template
  		public static void nextPermutation(int[] nums) {
  		    //find first decreasing digit
  		    int mark = -1;
  		    for (int i = nums.length - 1; i > 0; i--) {
  		        if (nums[i] > nums[i - 1]) {
  		            mark = i - 1;
  		            break;
  		        }
  		    }
  		 
  		    if (mark == -1) {
  		        reverse(nums, 0, nums.length - 1);
  		        return;
  		    }
  		 
  		    int idx = nums.length-1;
  		    for (int i = nums.length-1; i >= mark+1; i--) {
  		        if (nums[i] > nums[mark]) {
  		            idx = i;
  		            break;
  		        }
  		    }
  		 
  		    swap(nums, mark, idx);
  		 
  		    reverse(nums, mark + 1, nums.length - 1);
  		}
  		 
  		public static void swap(int[] nums, int i, int j) {
  		    int t = nums[i];
  		    nums[i] = nums[j];
  		    nums[j] = t;
  		}
  		 
  		public static void reverse(int[] nums, int i, int j) {
  		    while (i < j) {
  		        swap(nums, i, j);
  		        i++;
  		        j--;
  		    }
  		}
  		
  		static int lower_bound (int[] arr, int hi, int cmp) {
  			int low = 0, high = hi, mid = -1;
  			while (low < high) {
  				mid = (low + high) / 2;
  				if (arr[mid] >= cmp) high = mid;
  				else low = mid + 1;
  			}
  			return low;
  		}
  	 
  		static int upper_bound (int[] arr, int hi, int cmp) {
  			int low = 0, high = hi, mid = -1;
  			while (low < high) {
  				mid = (low + high) / 2;
  				if (arr[mid] > cmp) high = mid;
  				else low = mid + 1;
  			}
  			return low;
  		}
  		// end of permutation and lower/upper bound template
  	}
  }