#include "bits/stdc++.h"
#define DEBUG_PRINT(var) std::cout<<#var<<" = " << var << std::endl;
#define rep(i, n) for (int i = 0; i < (n); ++i)
using namespace std;
typedef long long ll;
typedef pair<int, int> P;
typedef vector<int> VI;
typedef vector<VI> VVI;//例: VVI dp(10, vector<int>(10, INF);
typedef priority_queue<int, vector<int>, less<int> > QUE_int;
const int INF = 2 * pow(10, 9) + 1;//+1しないとREになるかも(out of rangeになるんかな?? )
#define PI 3.14159265359

vector<int> dx = { -1, 0, 1, 0, -1, -1, 1, 1 };
vector<int> dy = { 0, -1, 0, 1, -1, 1, -1, 1 };

ll max(ll a, ll b) { return (a > b) ? a : b; }
ll min(ll a, ll b) { return (a < b) ? a : b; }ll chmax(ll &a, ll b){ return a = (a>b) ? a : b;}
ll chmin(ll &a, ll b){ return a = (a<b) ? a : b;}



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

// auto mod int
// https://youtu.be/L8grWxBlIZ4?t=9858
// https://youtu.be/ERZuLAxZffQ?t=4807 : optimize
// https://youtu.be/8uowVvQ_-Mo?t=1329 : division
const long long mod = pow(10, 9) + 7;
struct mint {
	ll x; // typedef long long ll;
	mint(ll x = 0) :x((x%mod + mod) % mod) {}
	mint operator-() const { return mint(-x); }
	mint& operator+=(const mint a) {
		if ((x += a.x) >= mod) x -= mod;
		return *this;
	}
	mint& operator-=(const mint a) {
		if ((x += mod - a.x) >= mod) x -= mod;
		return *this;
	}
	mint& operator*=(const mint a) {
		(x *= a.x) %= mod;
		return *this;
	}
	mint operator+(const mint a) const {
		mint res(*this);
		return res += a;
	}
	mint operator-(const mint a) const {
		mint res(*this);
		return res -= a;
	}
	mint operator*(const mint a) const {
		mint res(*this);
		return res *= a;
	}
	mint pow(ll t) const {
		if (!t) return 1;
		mint a = pow(t >> 1);
		a *= a;
		if (t & 1) a *= *this;
		return a;
	}

	// for prime mod
	mint inv() const {
		return pow(mod - 2);
	}
	mint& operator/=(const mint a) {
		return (*this) *= a.inv();
	}
	mint operator/(const mint a) const {
		mint res(*this);
		return res /= a;
	}
};

// a+b mod p
long long add_modp(long long a, long long b, long long p){
    return (a % p + b % p) % p;
}
// a-b mod p
long long sub_modp(long long a, long long b, long long p) {
	long long res = add_modp(a, -b, p);
	if (res < 0) return  res + p;
	return res;
}
// a*b mod p
long long mul_modp(long long a, long long b, long long p){
    return ((a % p) * (b % p)) % p;
}
// a^n mod p
long long pow_modp(long long a, long long n, long long p){
    
    long long res = 1;
    while (n > 0) {
        if (n & 1) res = mul_modp(res, a, p);
        a = mul_modp(a, a, p);
        n >>= 1;
    }
    return res;
}
// mod. m での a の逆元 a^{-1} を計算する
long long modinv(long long a, long long m) {//https://qiita.com/drken/items/3b4fdf0a78e7a138cd9a
    long long b = m, u = 1, v = 0;
    while (b) {
        long long t = a / b;
        a -= t * b; swap(a, b);
        u -= t * v; swap(u, v);
    }
    u %= m;
    if (u < 0) u += m;
    return u;
}

// combination mod prime
// https://www.youtube.com/watch?v=8uowVvQ_-Mo&feature=youtu.be&t=1619
struct combination {
	vector<mint> fact, ifact;
	combination(int n) :fact(n + 1), ifact(n + 1) {
		assert(n < mod);
		fact[0] = 1;
		for (int i = 1; i <= n; ++i) fact[i] = fact[i - 1] * i;
		ifact[n] = fact[n].inv();
		for (int i = n; i >= 1; --i) ifact[i - 1] = ifact[i] * i;
	}
	mint operator()(int n, int k) {
		if (k < 0 || k > n) return 0;
		return fact[n] * ifact[k] * ifact[n - k];
	}
};



template <typename TYPE>
void print_vec(const vector<TYPE>& v){
	for(int i=0; i<v.size(); i++){
		cout << v[i] << " ";
	}
	cout << endl;
}

template <typename TYPE>
void print_vec2(const vector<vector<TYPE>>& v){
	for(int i=0; i<v.size(); i++){
		cout << "i=" << i << ":   ";
		for(int j=0; j<v[i].size(); j++){
			cout << v[i][j] << "   ";
		}
		cout << endl;
	}
}

vector<ll> enum_divisor(ll x){
	ll tmp = x;
	vector<ll> res;
	for(ll i=1; i*i<=x; i++){
		if(tmp%i == 0){
			res.push_back(i);
			if(i*i != tmp) res.push_back(tmp/i);//iが√tmpのときは重複して数えないようにする
		} 
	}
	return res;
}


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

bool check(vector<P> vec){
	ll h = 0;
	for(int i=0; i<vec.size(); i++){
		int b = h + vec[i].first;
		if(b < 0) return false;
		h += vec[i].second;
	}
	return true;
}

int main(void) {
	ll N;
	cin >> N;
	vector<string> S_vec(N);
	vector<P> num(N);// "()"を打ち消した後の '(' と')'の個数を格納
	for(int i=0; i<N; i++){
		cin >> S_vec[i];

		ll l_num=0, r_num=0;
		for(int j=0; j<S_vec[i].size(); j++){
			if(S_vec[i][j]=='(') l_num++;
			else{
				if(l_num>0) l_num--;
				else r_num++;
			}
		}
		num[i] = P(l_num, r_num);		
	}

	//それぞれの文字列について， '('で+1  ')'で-1の折れ線を書いたときの
	//最下点(first)と　   最右点の高さ-最左点の高さ(second)　を格納
	//ただしゴール地点が負なら　最右点から見た時の最下点と　最左点の高さ-最右点の高さ　を格納
	//つまり
	//
	//if(l_num>r_num)  最下点 = -r_num ,  ゴール地点 = l_num - r_num
	//if(l_num<r_num)  最下点 = -r_num  , ゴール地点 = r_num - r_num
	vector<P> ls, rs;
	ll total = 0;
	for(int i=0; i<N; i++){
		ll l_num = num[i].first;
		ll r_num = num[i].second;
		ll h = l_num - r_num;
		if(h>0) ls.push_back(P(-r_num, h));
		else rs.push_back(P(-l_num, -h));
		total += h;
	}
	sort(ls.rbegin(), ls.rend());//最下点を降順ソート
	sort(rs.rbegin(), rs.rend());//最下点を降順ソート

	// cout << " num: ";
	// for(int i=0; i<num.size(); i++){
	// 	cout << "  (" << num[i].first <<", " << num[i].second << ")";
	// }
	// cout << endl;
	// cout << " ls: ";
	// for(int i=0; i<ls.size(); i++){
	// 	cout << "  (" << ls[i].first <<", " << ls[i].second << ")";
	// }
	// cout << endl;
	// cout << " rs: ";
	// for(int i=0; i<rs.size(); i++){
	// 	cout << "  (" << rs[i].first <<", " << rs[i].second << ")";
	// }
	// cout << endl;
	
	if(check(ls) && check(rs) && total==0) cout << "Yes" << endl;
	// if(check(ls)) cout << "yah1" << endl;
	// if(check(rs)) cout << "yah2" << endl;
	// if(total == 0)  cout << "yah3"<<endl;
	else cout << "No" << endl;







	// sort(num.begin(), num.end());//r_numで昇順ソート

	// for(int i=0; i<num.size(); i++){
	// 	cout << "(" << num[i].first <<", " << num[i].second << ")" << endl;

	// }

	// bool ans = true;
	// vector<bool> is_count(N, false);
	// ll cnt = 0, l_cnt=0, r_cnt=0;
	// for(int i=0; i<N; i++){
	// 	cnt -= num[i].first;
	// 	if(cnt<0) {
	// 		ans = false;
	// 		break;
	// 	}
	// 	cnt += num[i].second;
	// }

	// if(ans) cout << "Yes" << endl;
	// else cout << "No" << endl;
}


Measured memory_bytes: 58068