A substring of some string is called the most frequent, if the number of its occurrences is not less than number of occurrences of any other substring.

You are given a set of strings. A string (not necessarily from this set) is called good if all elements of the set are the most frequent substrings of this string. Restore the non-empty good string with minimum length. If several such strings exist, restore lexicographically minimum string. If there are no good strings, print "NO" (without quotes).

A substring of a string is a contiguous subsequence of letters in the string. For example, "ab", "c", "abc" are substrings of string "abc", while "ac" is not a substring of that string.

The number of occurrences of a substring in a string is the number of starting positions in the string where the substring occurs. These occurrences could overlap.

String a is lexicographically smaller than string b, if a is a prefix of b, or a has a smaller letter at the first position where a and b differ.

Input

The first line contains integer n (1 ≤ n ≤ 105) — the number of strings in the set.

Each of the next n lines contains a non-empty string consisting of lowercase English letters. It is guaranteed that the strings are distinct.

The total length of the strings doesn't exceed 105.

Output

Print the non-empty good string with minimum length. If several good strings exist, print lexicographically minimum among them. Print "NO" (without quotes) if there are no good strings.

Examples

Input

4
mail
ai
lru
cf


Output

cfmailru


Input

3
kek
preceq
cheburek


Output

NO

Note

One can show that in the first sample only two good strings with minimum length exist: "cfmailru" and "mailrucf". The first string is lexicographically minimum.
import java.util.*;
public class Main {	
	public static void main(String args[]){
		Scanner sc=new Scanner(System.in);
		int a=sc.nextInt();
		int c[]=new int[26];
		Node nod[]=new Node[26];
		for(int n=0;n<26;n++){
			Node node=new Node(n);
			nod[n]=node;
		}
		boolean is=true;
		for(int n=0;n<a;n++){
			String s=sc.next();
			if(!is)continue;
			c[s.charAt(0)-'a']=1;
			for(int m=1;m<s.length();m++){
				int l=s.charAt(m-1)-'a';
				int r=s.charAt(m)-'a';
				c[r]=1;
				if(nod[r].head==-1){
					nod[r].head=l;
				}
				else if(nod[r].head!=l){
					is=false;
				}
				
				if(nod[l].next==-1){
					nod[l].next=r;
				}
				else if(nod[l].next!=r){
					is=false;
				}
				
				if(nod[l].next==nod[l].head&&nod[r].head==nod[r].next){
					is=false;
				}
				
			}
			
		}
		
		if(is){
			int sum=0;
			String ss="";
			for(int n=0;n<26;n++){
				if(c[n]==1)sum++;
			}
			
			while(sum!=0){
				
				
				int t=-1;
				for(int n=0;n<26;n++){
					if(c[n]==1&&nod[n].head==-1){
						char ch=(char) (nod[n].t+'a');
						ss+=String.valueOf(ch);
						t=nod[n].next;
						sum--;
						c[n]=0;
						break;
					}
					if(n==25){
						is=false;
					}
				}
				for(;;){
					if(t==-1)break;
					char ch=(char)(nod[t].t+'a');
					ss+=String.valueOf(ch);
					c[t]=0;
					t=nod[t].next;
					sum--;				
				}
				if(!is){
					break;
				}
			}
			if(is){
				System.out.println(ss);
			}
			else{
				System.out.println("NO");
			}
			
		}
		else{
			System.out.println("NO");
		}
		
	}
	
}

class Node{
	int head=-1,next=-1,t;
	Node(int t){
		this.t=t;
	}
}


