#include <bits/stdc++.h>
#define REP(i, n) for (int i = 0; i < (int)(n); i++)
#define REPLL(i, n) for (ll i = 0; i < (ll)(n); i++)
using namespace std;
template<class T>inline bool chmax(T &a, const T &b){if(a < b){a = b; return 1;}return 0;}
template<class T>inline bool chmin(T &a, const T &b){if(a > b){a = b; return 1;}return 0;}
typedef long long ll;

int main(){
  ios::sync_with_stdio(false);
  cin.tie(0);
  int N; cin >> N;
  vector<string> S(N);
  REP(i, N){
    cin >> S[i];
  }
  vector<pair<int, int> > V(N, pair<int, int>()); // {-L.size(), R.size()}
  vector<pair<int, int> > VV(N, pair<int, int>()); // {R.size()-L.size(), -L.size()}
  priority_queue<pair<int, int> > pqL0; // Lが0のものを入れる（差は絶対にプラスになる）
  priority_queue<pair<int, int> > pqR0; // Rが0のものを入れる（差は絶対にマイナスになる）
  priority_queue<pair<int, int> > pqplu; // 差が0以上のものを入れる
  priority_queue<pair<int, int> > pqmin; // 差がマイナスのものを入れる
  int LRsum = 0; // R.size() - L.size()の総和
  REP(i, N){
    stack<char> L;
    stack<char> R;
    REP(j, S[i].size()){
      if(S[i][j] == '(') R.push('(');
      if(S[i][j] == ')'){
        if(!R.empty()){
          R.pop();
        }else{
          L.push(')');
        }
      }
    }
    V[i] = {-L.size(), R.size()};
    VV[i] = {R.size()-L.size(), -L.size()};
    LRsum += VV[i].first;
    if(V[i].first == 0) pqL0.push(VV[i]);
    if(V[i].second == 0) pqR0.push(VV[i]); 
    if(VV[i].first >= 0 && V[i].first != 0) pqplu.push(VV[i]);
    if(VV[i].first < 0 && V[i].second != 0) pqmin.push(VV[i]);
  }
  if(pqL0.size() == 0 || pqR0.size() == 0 || LRsum != 0){ //　これらの条件が1個でも当てはまったら✕
    cout << "No" << endl;
    return 0;
  }
  //************* 最初の文字列のセット ************* //
  int Rval = pqL0.top().first; pqL0.pop(); // 最初の文字列をセット。Rの値を保持しておく。
  while(!pqL0.empty()){
    pqplu.push(pqL0.top()); pqL0.pop();
  }

  //************* 差がプラスの文字列のセット ************* //
  queue<pair<int, int> > q; // 繋げられないものの仮置場
  while(!pqplu.empty()){
    if(Rval + pqplu.top().second >= 0){
      Rval += pqplu.top().first;
      pqplu.pop();
      while(!q.empty()){
        pqplu.push(q.front()); q.pop(); // 仮置場から戻してやる
      }
    }else{
      q.push(pqplu.top());
      pqplu.pop();
    }
  }
  if(!q.empty()){ // 繋げられない場合は✕
    cout << "No" << endl;
    return 0;
  }

  //************* 差がマイナスの文字列のセット ************* //
  while(!pqmin.empty()){
    if(Rval + pqmin.top().second >= 0){
      Rval += pqmin.top().first;
      pqmin.pop();
      while(!q.empty()){
        pqmin.push(q.front()); q.pop();
      }
    }else{
      q.push(pqmin.top());
      pqmin.pop();
    }
    if(pqmin.empty() && !q.empty()){
      queue<pair<int, int> > qR0;
      while(!pqR0.empty()){
        if(Rval + pqR0.top().second >= 0){
          Rval += pqR0.top().first;
          pqR0.pop();
          while(!qR0.empty()){
            pqR0.push(qR0.front()); qR0.pop();
          }
          while(!q.empty()){
            pqmin.push(q.front()); q.pop();
          }
        }else{
          qR0.push(pqR0.top());
          pqR0.pop();
        }   
      }
    }
  }
  if(!q.empty()){ // 繋げられない場合は✕
    cout << "No" << endl;
    return 0;
  }

  //************* 右側の0の文字列のセット ************* //
  queue<pair<int, int> > q0;
  while(!pqR0.empty()){
     if(Rval + pqR0.top().second >= 0){
      Rval += pqR0.top().first;
      pqR0.pop();
      while(!q0.empty()){
        pqR0.push(q0.front()); q0.pop();
      }
    }else{
      q0.push(pqR0.top());
      pqR0.pop();
    }   
  }
  if(!q0.empty()){ // 繋げられない場合は✕
    cout << "No" << endl;
    return 0;
  }
  cout << "Yes" << endl;  
}

Measured memory_bytes: 63940