#include<bits/stdc++.h>
#define ll long long
#define N 1000005
#define M 1000000007
#define pii pair<ll,ll>
#define fast ios_base::sync_with_stdio(0);cin.tie(0);
using namespace std;
vector<pii>v;
pii mx[N*3];
int iter[N*3];
void build(int node,int l,int r)
{
    if(l==r)
    {
        mx[node]=v[l];
        iter[node]=l;
        return;
    }
    build(node*2,l,(l+r)/2);
    build(node*2+1,(l+r)/2+1,r);
    if(mx[node*2].second>mx[node*2+1].second)
    {
        mx[node]=mx[node*2];
        iter[node]=iter[node*2];
    }
    else if(mx[node*2].second<mx[node*2+1].second)
    {
        mx[node]=mx[node*2+1];
        iter[node]=iter[node*2+1];
    }
    else
    {
        if(mx[node*2].first<mx[node*2+1].first)
        {
            mx[node]=mx[node*2];
            iter[node]=iter[node*2];
        }
        else
        {
            mx[node]=mx[node*2+1];
            iter[node]=iter[node*2+1];
        }
    }
}
pii now;
int hss;
void query(int node,int l,int r,int b,int e)
{
    if(e<l||r<b)
        return;
    if(b<=l&&r<=e)
    {
        if(now.second<mx[node].second)
        {
            now=mx[node];
            hss=iter[node];
        }
        else if(mx[node*2].second==mx[node*2+1].second)
        {
            if(now.first>mx[node].first)
            {
                now=mx[node];
                hss=iter[node];
            }
        }
        return;
    }
    query(node*2,l,(l+r)/2,b,e);
    query(node*2+1,(l+r)/2+1,r,b,e);
    return;
}
void update(int node,int l,int r,int p)
{
    if(p<l||r<p)
        return;
    if(l==r)
    {
        mx[node]= {1e9,-1e9};
        iter[node]=l;
        return;
    }
    update(node*2,l,(l+r)/2,p);
    update(node*2+1,(l+r)/2+1,r,p);
    if(mx[node*2].second>mx[node*2+1].second)
    {
        mx[node]=mx[node*2];
        iter[node]=iter[node*2];
    }
    else if(mx[node*2].second<mx[node*2+1].second)
    {
        mx[node]=mx[node*2+1];
        iter[node]=iter[node*2+1];
    }
    else
    {
        if(mx[node*2].first<mx[node*2+1].first)
        {
            mx[node]=mx[node*2];
            iter[node]=iter[node*2];
        }
        else
        {
            mx[node]=mx[node*2+1];
            iter[node]=iter[node*2+1];
        }
    }
}


main()
{
    int n;
    cin>>n;
    for(int i=0; i<n; i++)
    {
        string s;
        int e1=0,e2=0;
        int mx=0;
        cin>>s;
        for(auto u:s)
        {
            if(u==')')
            {
                if(e1>0)
                {
                    e1--;
                }
                else
                {
                    e2++;

                }
            }
            else
            {
                e1++;
            }
        }
        v.push_back({e2,e1});
    }
    sort(v.begin(),v.end());
    build(1,0,n-1);

    int op=0;
    bool f=true;
    for(int i=1; i<=n; i++)
    {
        int low=0,high=n-1;
        int ans=-1;
        while(low<=high)
        {
            int mid=(low+high)/2;
            if(v[mid].first<=op)
            {
                ans=mid;
                low=mid+1;
            }
            else
                high=mid-1;
        }
        if(ans==-1)
        {
            f=false;
            break;
        }
        now= {1e9,-1e9};
        hss=-1;
        query(1,0,n-1,0,ans);
        if(hss==-1)
        {
            f=false;
            break;
        }
        op-=now.first;
        op+=now.second;
        update(1,0,n-1,hss);
    }

    if(f&&op==0)
        cout<<"Yes";
    else
        cout<<"No";
}


Measured memory_bytes: 59916